UVA 10780 - Again Prime No Time

来源:互联网 发布:网络虚拟财产保护2017 编辑:程序博客网 时间:2024/05/16 16:04

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;}


原创粉丝点击