题意:
给你一个十进制数
,然后问你在
进制下
的尾数有多少个0,有多少位。
思路:
在十进制中求
中有多少0,做法是看1到N之中有多少个5,就有多少个零,因为
,又因为2的数量多(偶数隔位出现)。
在本题中也是这个思路,不过,对
进行质因数分解后,不能贸然选取最大的质因数,因为数量具有不确定性。就拿14 175来说,
,14中有两个5两个7,两个5会产生一个0,如果用7来算答案就是2。
所以我们对
进行质因数分解,并保存下来质因数出现的次数。然后逐个算取最小的即可。
有多少位呢,都知道10进制中逢十进一,一个数中有多少10,就是进了几位(还有个位)。
所以在
进制中同样
int prim[1000];
int tot[1000];
int main(){
int n,m;
while(cin >> n >> m){
memset(tot,0,sizeof tot);
int x = m;
int inx = 0;
for(int i = 2;i * i <= x;++i){
if(!(x%i)){
prim[++inx] =i;
while(!(x%i)) x/= i,tot[inx] ++;
}
}
if(x > 1) prim[++inx] = x,tot[inx] ++;
int M = INF;
for(int i = 1;i <= inx;++i){
x = n;
int cnt = 0;
while(x){
cnt += x/=prim[i];
}
M = min(M,cnt/tot[i]);
}
double res(0);
for(int i = 1; i <= n;++i){
res += log(i);
}
ll ans = floor(res/log(m)+eps) + 1;
printf("%d %lld\n",M,ans);
}
}