洛谷P2726 阶乘 Factorials
题目背景
N的阶乘写作N!,表示小于等于N的所有正整数的乘积。
题目描述
阶乘会变大得很快,如13!就必须用32位整数类型来存储,到了70!即使用浮点数也存不下了。 你的任务是找到阶乘最前面的非零位。举个例子:
5!=1*2*3*4*5=120,所以5!的最靠前的非零位是1。
7!=1*2*3*4*5*6*7=5040,所以最靠前的非零位是5。
输入输出格式
输入格式:
共一行,一个不大于4,220的正整数N
输出格式:
共一行,输出N!最靠后的非零位。
输入输出样例
输入样例#1:
7
输出样例#1:
5
说明
题目翻译来自NOCOW。
USACO Training Section 3.2
1 /*by SilverN*/ 2 #include<algorithm> 3 #include<iostream> 4 #include<cstring> 5 #include<cstdio> 6 #include<cmath> 7 #include<vector> 8 using namespace std; 9 int x[10][10]; 10 int n; 11 int cnt=0; 12 int main(){ 13 int i,j; 14 for(i=1;i<=9;i++) 15 for(j=1;j<=9;j++) 16 x[i][j]=(i*j)%10; 17 scanf("%d",&n); 18 int tmp=n; 19 while(tmp){cnt+=tmp/5;tmp/=5;} 20 int ans=1; 21 for(i=1;i<=n;i++){ 22 tmp=i; 23 while(tmp%5==0)tmp/=5; 24 while((tmp&1)==0 && cnt){ 25 --cnt; 26 tmp/=2; 27 } 28 ans=x[ans][tmp%10]; 29 } 30 printf("%d\n",ans); 31 return 0; 32 }
本文为博主原创文章,转载请注明出处。