题目:
给定n,a求最大的k,使n!可以被a^k整除但不能被a^(k+1)整除。
输入描述:
两个整数n(2<=n<=1000),a(2<=a<=1000)
输出描述:
一个整数.
示例1
输入
6 10
输出
1
代码:
#include <iostream>
#include <fstream>
using namespace std;
const int maxn = 10000;
const int INF = 9999999;
bool mark[maxn + 1];
int prime[maxn + 1];
int primeSize;
int cnt1[maxn + 1];
int cnt2[maxn + 1];
void getPrime(){
for(int i = 0; i <= maxn; ++i){
mark[i] = false;
}
primeSize = 0;
for(int i = 2; i <= maxn; ++i){
if(mark[i]) continue;
prime[primeSize++] = i;
if(i >= 1000) continue;
for(int j = i * i; j <= maxn; j += i){
mark[j] = true;
}
}
}
// to cal prime number of n!
void cal4n(int n){
for(int i = 0; i < primeSize; ++i){
int t = n;
while(t){
cnt1[i] += t / prime[i];
t /= prime[i];
}
}
}
//void cal4a(int a){
// for(int i = 0; i < primeSize; ++i){
// while(a % prime[i] == 0){
// cnt2[i]++;
// a /= prime[i];
// }
//
// }
//}
int main(){
int n, a;
getPrime();
while(cin >> n >> a){
for(int i = 0; i < primeSize; ++i){
cnt1[i] = cnt2[i] = 0;
}
cal4n(n);
int min = INF;
for(int i = 0; i < primeSize; ++i){
while(a % prime[i] == 0){
cnt2[i]++;
a /= prime[i];
}
if(cnt2[i] == 0) continue;
if(min > cnt1[i] / cnt2[i]){
min = cnt1[i] / cnt2[i];
}
}
cout << min << endl;
}
}