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

UVA 10780 - Again Prime No Time

2013-09-05 14:44 239 查看
UVA 10780 - AgainPrime No Time

 

原题大意:已知m和n,求最大的k ,使(m^k) | n!。

分析:我们知道,对于a=a1^p1*a2^p2*……an^pn  ,  b=b1^q1*b2^q2*……bn^qm, 若a | b,

则 a的质因子集A={a1,a2,…..,an}必定是b的质因子集B={b1,b2,….,bm}的子集,且对于所有

ai=bj有pi<=qj。否则a不能整除b。

因此只需将m分解为:m= a1^p1*a2^p2*……an^pn,  n!分解为n!=b1^q1*b2^q2*……bn^qm, 

然后求出qj / pi (ai=bj) 的最小值即可。

可是n!的质因数分解有点复杂,实际上我们只需找出n! 中质因子ai的个数。这个问题的算法为:

n/ai+n/(ai^2)+n/(ai^3)+…….

如25! 含 5 的个数为 25/5+25/5^2=6.

 

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<stack>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<stack>
#include<map>
#include<vector>
typedef long long LL;
using namespace std;
const int INF=0x3f3f3f3f;

int main()
{
int n,m,cas=1,T,tmp,t,k;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&m,&n);
int ans=INF;
for(int i=2;i*i<=m;i++)
{
if(m%i==0)
{
tmp=n;
t=k=0;
while(m%i==0) m/=i,k++;
while(tmp) t+=tmp/i,tmp/=i;
ans=min(ans,t/k); //当m不能整除n!(m^x更不能整除n!)时,t<k,t/k=0 。 即 ans=0。
}
}
if(m>1)
{
t=0; tmp=n;
while(tmp) t+=tmp/m,tmp/=m;
ans=min(ans,t);
}
printf("Case %d:\n",cas++);
if(ans) printf("%d\n",ans);
else printf("Impossible to divide\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: