准备知识:
1.(算术基本定理)任何大于1的正整数n都可以表示成素数之积,即素数是整数的乘法构成单位。每个大于1的正整数n都可以被唯一地写成素数的乘积,在乘积中的素因子按照非降序排列。正整数n的分界式
n=(p1^a1)*(p2^a2)*......*(pk^ak)
称为n的标准分解式,其中p1,p2,......,pk是素数,p1<p2<......<pk,且a1,a2,......,ak是正整数。
2.n!的素因子分解中的素数p的幂为
[n / p]+[m / p^2]+[n / p^3]+...
题目:
Description
从输入中读取一个数n,求出n!中末尾0的个数。
Input
输入有若干行。第一行上有一个整数m,指明接下来的数字的个数。然后是m行,每一行包含一个确定的正整数n,1<=n<=1000000000。
Output
对输入行中的每一个数据n,输出一行,其内容是n!中末尾0的个数。
Sample Input
3 3 100 1024
Sample Output
0 24 253
分析:
题目意思很简单,就是要求阶乘中0的个数,那么根据n!的素因子分解中素数幂的求法,我们可以只关注2和5的幂是多少,因为素数中只有2和5能够凑成素数末尾中的0,所以我们只需求出2,5的幂,然后取出小值就是结果。
代码:
#include <iostream>
using namespace std;
#define ll long long
int main()
{
int m;
cin>>m;
while(m--)
{
ll n;
cin>>n;
ll t=n,sum1=0,sum2=0;
ll pf=5,pt=2;
while(pf<t)
{
sum1+=t/pf;
pf*=5;
}
t=n;
while(pt<t)
{
sum2+=t/pt;
pt*=2;
}
cout<<min(sum1,sum2)<<endl;
}
return 0;
}