您的位置:首页 > 大数据 > 人工智能

【UVa 10780】 Again Prime? No time.

2014-02-18 13:21 295 查看
【题目大意】

给定两个正整数N,M。求一个最大的正整数k,使得Mk|N!

【分析】

直接将N!和M的质因子分解,然后比较指数即可。

N!的质因子分解式:

    设N!=p1a1 × p2a2 × p3a3 ××× pkak

那么pi的指数
ai=sigma(N/(pij))  pij<=N

【代码】
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <queue>

using namespace std;

#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define rrep(i,b,a) for(int i=(b);i>=(a);--i)
#define pf printf
#define sf scanf
#define p_b push_back
#define INF (~0U>>1)
#define MAXN 20010

string error("Impossible to divide");
int N,M;
bool f[MAXN+10];
int zs[MAXN+10];
vector <int> Prime;

void Getprime(){
int n=sqrt(MAXN);
rep(i,2,MAXN){
if(!f[i]){
Prime.p_b(i);
for(int j=i*i;j<=MAXN;j+=i)
f[j]=true;
}
}
}

int Getans(){
int rt=INF;
memset(zs,0,sizeof zs);
int n=Prime.size();
int m;
rep(i,0,n-1){
if(Prime[i]>N){
m=i;
break;
}
int acc=0,tmp=Prime[i];
while(tmp<=N){
acc+=N/tmp;
tmp*=Prime[i];
}
zs[i]=acc;
}
rep(i,0,m-1){
if(M%Prime[i]!=0) continue;
int acc=0;
while(M%Prime[i]==0){
acc++;
M/=Prime[i];
}
rt=min(rt,zs[i]/acc);
}
return M==1?rt:0;
}

int main(){
int Kase;
sf("%d",&Kase);
Getprime();
rep(i,1,Kase){
pf("Case %d:\n",i);
sf("%d%d",&M,&N);
int ans=Getans();
if(ans)
pf("%d\n",ans);
else
cout<<error<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: