题目链接:http://codeforces.com/contest/1114/problem/C
题面:
题目描述:求n的阶乘用b进制表示后,有多少个后导零。
解题思路:将b进行质因数分解为p1^x1*p2^x2*p3^x3.....后,再将n的阶乘质因数分解为p1^y1*p2^y2*p3^y3.....,答案就是
min(yi/xi);求阶乘中某一个质因子的数目有一个高效的方法,具体看以下代码。
代码如下:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e6+1e3;
typedef long long ll;
ll n,k;
vector <ll> pri;
ll tot[maxn] = {0};
ll func(ll key){
ll now = n,ans = 0;
while(now){
ans += now/key;
now /= key;
}
return ans;
}
int main(){
cin >> n >> k;
for(ll i = 2;i*i <= k; i++){
if(k%i == 0)pri.push_back(i);
while(k%i == 0){
k /= i;
tot[pri.size()-1]++;
}
}
if(k != 1){
pri.push_back(k);
tot[pri.size()-1]++;
}
ll ans = 0x3f3f3f3f3f3f3f3f;
for(ll i = 0;i < pri.size(); i++){
ans = min(ans,func(pri[i])/tot[i]);
}
cout<<ans<<endl;
return 0;
}