题目描述:
给定n,a求最大的k,使n!可以被a^k整除但不能被a^(k+1)整除。
输入:
两个整数n(2<=n<=1000),a(2<=a<=1000)
输出:
一个整数.
样例输入:
6 10
样例输出:
1
 
 
#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
 
bool mark[1001];
int prime[1001];
int size=0;
void init(){
for (int i=2;i<=1000;i++)
mark[i]=false;
for (int i=2;i<=1000;i++){//输入数据是10^9,这里用100000以下的素数做分解是因为n的大于sqrt(n)的因子只能有一个
if (mark[i])
continue;
prime[size++]=i;
if (i>=100) continue;//没加这句程序就崩溃了,应该是因为i>1000,那么j就越界了
for (int j=i*i;j<=1000;j+=i){
mark[j]=true;
}
}
}
 
int main (){
int n,a;
int ans[30];
int as;
int anscnt[30];
init();
while (cin>>n>>a){
as=0;
for (int i=0;i<size;i++){
if (a%prime[i] == 0){
ans[as]=prime[i];
anscnt[as]=0;
 
while(a%prime[i] == 0){
anscnt[as]++;
a /= prime[i];
}
 
as++;
if (a==1)
break;
}
 
}
 
if (a!=1){
ans[as]=a;
anscnt[as++]=1;
}
 
int k=1000000;
int temp=0;
int tt=0;
for (int i=0;i<as;i++){
temp=0;
for (int j=n;j>1;j--){
int nn=j;
while (nn%ans[i] == 0){
temp++;
nn /= ans[i];
tt=temp/anscnt[i];
if (tt>=k)
break;
}
 
}
if (tt< k)
k=tt;
}
 
cout<<k<<endl;
 
}
return 0;
}
 
这是自己做得,没有按照书上的方法。
思路是先计算a的素因子,个数为x,然后计算每一个素因子在n!中有y个,所有素因子的y/x的最小值即为答案。
由于输入数据是1000,所以输入数据的不同素因子个数最多为6.(2*3*5*7*11*13就已经超过了1000)