题目
给定n,a求最大的k,使n!可以被ak整除但不能被a(k+1)整除。
输入描述: 两个整数n(2<=n<=1000),a(2<=a<=1000)
输出描述: 一个整数.
示例1
输入
6 10
输出
1
代码
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
//只要能够包含a的素因数即可
int mark[1005] = {0};
int prime[1005] = {0};
int primeSize = 0;
void getPrime(){
for(int i=2;i<=1000;i++){
if(mark[i] == 1) continue;
else{
//是素数
prime[primeSize++] = i;
//标记非素数
for(int j=i*i;j<=1000;j+=i){
mark[j] = 1;
}
}
}
}
int main(){
getPrime();
int n,a;
int p,e;
cin >> n >> a;
int ans = 123123123; //一个很大的数
for(int i=0;i<primeSize;i++){
//寻找a的素因数
p = prime[i]; //素数
e = 0; //幂指数
//a的素因数分解:计算关于素数a的幂指数e
while(a%p==0){
e++;
a /= p;
}
if(e!=0){
//如果p是a的素因数
//计算n!中p的幂指数
int e2 = 0;
int t = n;
while(t){
e2 += t/p; //1...n中,是p的倍数的数的个数n/p:都能提供1个p
//1...n中,是p*p的倍数的数的个数n/(p*p): 都能提供2个p(前面已经计算过1次,所以都提供(2-1)个p)
t /= p;
}
//计算k,取最小的
if(e2/e < ans){
ans = e2/e;
}
}
if(a==1) break; //a的素因数分解完成,提前结束
}
cout << ans << endl;
}
贵交的题好难写噢QAQ