阶乘之乘
题目背景 不告诉你…… 题目描述 求出1!*2!*3!*4!*……*n!的末尾有几个零 输入输出格式 输入格式: n(n<=10^8) 输出格式: 有几个零 输入输出 输入样例#1: 10 输出样例#1: 7
我的做法:
将1-n 的阶乘 对2和5进行质因数分解
假设有A个5,B个2
那么最终答案为min(A,B)
原理:2*5=10
得分:80
1 #include<algorithm> 2 #include<iostream> 3 #include<cstring> 4 #include<string> 5 #include<cstdio> 6 #include<cmath> 7 #define ll long long 8 #define DB double 9 using namespace std; 10 inline int read() 11 { 12 int x=0,w=1;char ch=getchar(); 13 while(!isdigit(ch)){if(ch=='-') w=-1;ch=getchar();} 14 while(isdigit(ch)) x=(x<<3)+(x<<1)+ch-'0',ch=getchar(); 15 return x*w; 16 } 17 int n,tmp; 18 int A,B; 19 int main() 20 { 21 n=read(); 22 for(int i=1;i<=n;++i) 23 { 24 tmp=i;while(tmp/5) A+=tmp/5,tmp/=5; 25 tmp=i;while(tmp/2) B+=tmp/2,tmp/=2; 26 } 27 printf("%d",min(A,B)); 28 return 0; 29 }
优化:
由分析可知,A一定小于等于B
所以直接统计A就可以了
所以在统计的时候i+=5
eg, 5!与6!,7!,8!,9!中5的个数是一样的
注意一下边界
还要开long long
1 #include<algorithm> 2 #include<iostream> 3 #include<cstring> 4 #include<string> 5 #include<cstdio> 6 #include<cmath> 7 #define ll long long 8 #define DB double 9 using namespace std; 10 inline ll read() 11 { 12 ll x=0,w=1;char ch=getchar(); 13 while(!isdigit(ch)){if(ch=='-') w=-1;ch=getchar();} 14 while(isdigit(ch)) x=(x<<3)+(x<<1)+ch-'0',ch=getchar(); 15 return x*w; 16 } 17 ll n,tmp,A,i,k,fg; 18 int main() 19 { 20 n=read(); 21 for(i=0;i<=n;i+=5) 22 { 23 tmp=i;k=0; 24 while(tmp/5) k+=tmp/5,tmp/=5; 25 A+=min(n-i+1,(ll)5)*k; 26 } 27 printf("%lld",A); 28 return 0; 29 }