题目1104:整除问题
时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:6156
解决:2117
-
题目描述:
-
给定n,a求最大的k,使n!可以被a^k整除但不能被a^(k+1)整除。
-
输入:
-
两个整数n(2<=n<=1000),a(2<=a<=1000)
-
输出:
-
一个整数.
-
样例输入:
-
6 10
-
样例输出:
-
1
-
来源:
- 2011年上海交通大学计算机研究生机试真题
-
- 代码思路来源参考书
#include<iostream>
#include<stdio.h>
#define Max 1010
using namespace std;
bool Mark[Max];
int prime[Max];
int primeSize;
void Isprime(){
primeSize=0;
for(int i=2;i<=1000;i++){
if(!Mark[i]){
prime[primeSize++]=i;
for(int j=i*i;j<=1000;j+=i){
Mark[j]=true;
}
}
}
}
int ncnt[Max]; //用来存放n!的素因子prime[i]的幂指数,可能为0
int acnt[Max]; //用来存放a的素因子prime[i]的幂指数
int main(){
int a,n;
Isprime();
while(scanf("%d%d",&n,&a)==2){ //如果n.a都被成功读入则返回值为2
for(int i=0;i<primeSize;i++){
acnt[i]=ncnt[i]=0; //进行初始化
}
for(int i=0;i<primeSize;i++){
int t=n; //这个必须在for循环里面,因为每次会求prime[i]在n中的因子数
while(t){
ncnt[i]+=t/prime[i]; //从1~n能提供一个或者一个以上P因子的一共有n/p个,提供两个或两个以上p因子的有n/(p*p)
t/=prime[i];
}
}
int ans=123123123;
for(int i=0;i<primeSize;i++){
while(a%prime[i]==0){
acnt[i]++; //说明a中对应prime[i]的幂指数要增加
a/=prime[i];
}
if(acnt[i]==0){ //若该素数不能从a中分解,则跳过
continue;
}
if(ncnt[i]/acnt[i]<ans){
ans=ncnt[i]/acnt[i];
}
}
printf("%d\n",ans);
}
return 0;
}