先要读懂题意:
n!%(a^k)==0,n!%(a^(k+1))!=0,输出k
一个非素数总能表示成若干个素数的乘积,所以这道题可以转化成:
- 将n!分解成若干个质因数{(x1,n1),(x2,n2),……} (其中(x1,n1)表示n!的质因子中有n1个x1)
- 将a分解成若干个质因数{(x1,a1),(x2,a2),……} ,(其中(x1,a1)表示a的质因子中有a1个x1)
- 将n1和a1对应相减,k++,如果减完以后,原来不=0的ni成了0,此时就说明可以停止了,(因为每一个a分解成的质因子都是相同的,这次成了0,说明n!%(a^k)==0,如果再除一次,n!%(a^k)就<0了);如果不是0,重复3
#include<iostream>
#include<vector>
#include<map>
using namespace std;
bool isprime[1005];
map<int,int> prime_count_n,prime_count_a;
void init(int n){
for(int i=0;i<=n;i++){
isprime[i]=true;
}
isprime[0]=false;
isprime[1]=false;
for(int i=2;i<=n;i++){
if(isprime[i]==false){
continue;
}
prime_count_n.insert(pair<int,int> (i,0));
for(int j=i*i;j<=n;j+=i){
isprime[j]=false;
}
}
}
int main(){
int n,a;
cin>>n>>a;
init(n);
for(int i=2;i<=n;i++){
int temp=i;
for(map<int,int>::iterator it=prime_count_n.begin();it!=prime_count_n.end();it++){
while(temp%it->first==0 && n){
it->second++;
temp/=it->first;
}
if(temp==1){
break;
}
}
}
// for(map<int,int>::iterator it=prime_count_n.begin();it!=prime_count_n.end();it++){
// cout<<it->first<<" "<<it->second<<endl;
// }
int flag=1,k=0; //标志以下while循环是否结束
while(flag){
int temp=a;
for(map<int,int>::iterator it=prime_count_n.begin();it!=prime_count_n.end();it++){
while(temp%it->first==0){
temp/=it->first;
it->second--;
if(it->second==0){
flag=0;
break;
}
}
if(temp==1){
k++;
break;
}
}
}
cout<<k<<endl;
// cout<<count<<endl;
return 0;
}