1.整除问题
给定n,a求最大的k,使n!可以被a^k整除但不能被a^(k+1)整除。
输入描述:
两个整数n(2<=n<=1000),a(2<=a<=1000)
输出描述:
一个整数.
解决方法:
1.素数筛
2.对n!质因子分解算法
3.对a质因子分解算法
int nFac[MAXN]={0};//记录n!的质因数分解后的结果,n!存在质因数i,则aFac[i]=指数
int aFac[MAXN]={0};//记录a的质因数分解的结果,a存在质因数i,则aFac[i]=指数
比较n!和a的相同质因数的指数相除的最小值为所求。
例如:
6!=2^4+3^2+5^1
10=2^1*5^1
有公共质因数:
2 指数相除为4/1=4
5 指数相除为1/1=1
所以答案为1
#include<vector>
#include<iostream>
#include<cmath>
#define N 1001
using namespace std;
vector<int> prime;
bool isPrime[1001];
void initial(){
//素数筛法求出1-1000内的所有素数
for(int i=0;i<1001;i++)
isPrime[i]=true;
isPrime[0]=false;
isPrime[1]=false;
for(int i=2;i<=1000;i++){
if(!isPrime[i])continue;
prime.push_back(i);
for(int j=i*i;j<1000;j+=i){
isPrime[j]=false;
}
}
}
int main(){
int n,a;
initial();
while(cin>>n>>a){
int count1[N]={0};
int count2[N]={0};
for(int i=0;i<prime.size();i++){
int t=n;
while(t){
count1[i]+=t/prime[i];
t/=prime[i];
}
}
int ans=233333333;
for(int i=0;i<prime.size();i++){
while(a%prime[i]==0){
count2[i]++;
a/=prime[i];
}
if(count2[i]==0)continue;
if(count1[i]/count2[i]<ans)
ans=count1[i]/count2[i];
}
cout<<ans<<endl;
}
return 0;
}