洛谷 P1134 [USACO3.2]阶乘问题
题意
也就是字面上的意思,求出N!阶乘的最右边的非零位的值。
做法
用模拟加数论的方法,因为想要在末尾出现一个0,那么就一定会是10的倍数,而10=2*5,所以只要看1~N中出现5的次数即可,因为2的倍数的数量一定是比5的倍数的数量多的。然后在循换中每次mod10求个位数,因为任何正整数相乘的个位数只与它们的个位数有关。
代码
#include<bits/stdc++.h> using namespace std; int n; int k; int main() { //freopen("fact4.in","r",stdin); //freopen("fact4.out","w",stdout); scanf("%d",&n); for(int i=1;i<=n;++i) { int s=i; while(s%5==0) { s/=5; k++; }//记录5的倍数出现的次数(指的是这个数有多少个5相乘) } int sum=1; for(int i=1;i<=n;++i) { int p=i; if(p%2==0&&k) { p/=2; --k; }//将2的倍数找到除以2,减少次数 while(p%5==0) p/=5; sum*=p; sum%=10;//每次%10找个位数 } printf("%d\n",sum); return 0; }

浙公网安备 33010602011771号