http://acm.hdu.edu.cn/showproblem.php?pid=1124
Problem
定义函数Z(n),表示n!的结果末尾零的个数。
Soultion
如果将数x进行质因数分解可以发现,要想两个质数相乘为零,只能是2*5了,所有我们就去找n!中质因数为2和质因数为5的个数各有多少个,取最小值即可。
下面贴上阶乘分解的代码。
求n!中质因子p出现的个数
while(n){
cnt2 += n/p;
n /= p;
}
Code
#include <bits/stdc++.h>
#define ll long long
#define pir pair<int,int>
const int N = 2e5+7;
const int mod = 1e9+7;
const ll ds = 1e15;
const double eps = 1e-8;
using namespace std;
ll read()
{
ll x=0,f=1;
char c=getchar();
while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9') x=(x<<1)+(x<<3)+c-'0',c=getchar();
return f*x;
}
void print(__int128 x)
{
if(x < 0) {putchar('-');x = -x;}
if(x/10) print(x/10);
putchar(x%10+'0');
}
void solve(){
int cnt1 = 0,cnt2 = 0;
int n,tmp;
n = read();
tmp = n;
while(tmp){
cnt1 += tmp/2;
tmp /= 2;
}
while(n){
cnt2 += n/5;
n /= 5;
}
print(min(cnt1,cnt2));
puts("");
}
int main(){
int t;
t = read();
while(t--)
solve();
system("pause");
return 0;
}
做完可以看看这道类似题:https://ac.nowcoder.com/acm/contest/1021/B