您的位置:首页 > 其它

USACO-Factorials(阶乘最后一个非0数)

2017-03-15 13:06 309 查看
一开始想的是每乘一位取最后一位数。

然后发现一个反例 14!=87178291200 ,15!=1307674368000 。

而2∗15/10=3 。

因为当乘上一个5时,会使得原来的最后一位数变成0,而新的最后一位数是由原来最后一位数的进位和原来的倒数第二位的最后一位数决定的。所以不能用这种方法。

所以考虑先把所有的因子5提出来,然后与2抵消,最后乘法中就不会出现最后一位非0数被消掉的情况了。

如:1∗2∗3∗4∗5∗6∗7∗8∗9∗10=1∗1∗3∗2∗1∗6∗7∗8∗9∗2∗10∗10

/*
ID: xdujlx1
PROG: fact4
LANG: C++
*/
#include<bits/stdc++.h>
using namespace std;
<
f6bf
span class="hljs-keyword">void ioinit()
{
freopen("fact4.in","r",stdin);
freopen("fact4.out","w",stdout);
}
int a[10007];
int main()
{
ioinit();
int n;
cin>>n;
int res=1;
int cnt=0;
for(int i=1;i<=n;i++) a[i]=i;
for(int i=5;i<=n;i+=5)
{
while(a[i]%5==0)
{
a[i]/=5;
cnt++;
}
}
for(int i=2;i/2<=cnt;i+=2) a[i]/=2;
for(int i=2;i<=n;i++)
{
res*=a[i];
while(res%10==0) res/=10;
res%=10;
}
cout << res << endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: