视频题解戳我
题目大意:求n!在b进制下末尾有多少个0.
解题思路:n!可以化成 ;k就代表了末尾0的个数,x不是b的倍数,即他的末尾不是0,每乘一个b相当于左移一位多一个0(就像2进制那样,都是一样的)。所以就是求n!总有多少个b,求出b的质因子,求出所有质因子在n!中的 个数/每一组b所需这个质因子个数 最少的那个( 质因子会重复,组成一个b可能需要多个相同的t ),那就是末尾0的个数,例如 12的质因子是2 2 3,那 n!中 2的个数/2 为res1, 3的个数 为res2,那末尾0的个数就是min(res1,res2); 那个的数量少就决定了12出现的次数。
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<cmath>
#include<sstream>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const ll inf=0x3f3f3f3f;
ll n,b,res=1e18;
void solve(ll x,ll num){ //每个质因子 拥有的数量
ll tp=1,ans=0;
while(tp<=n/x){ //不能用tp*x会爆精度,有多少个x,就是先看有多少个x,再x^2,x^3,直到>n
tp*=x;
ans+=n/tp;
}
res=min(res,ans/num);
}
int main(){
std::ios::sync_with_stdio(0);
cin>>n>>b;
ll t=b;
for(ll i=2;i*i<=t;++i){ //分解质因子
if(t%i==0){
ll num=0;
while(t%i==0){
t/=i;
num++;
}
solve(i,num);
}
}
if(t>1) solve(t,1);
cout<<res<<endl;
return 0;
}