首页 > 代码库 > uva10780(分解质因数)

uva10780(分解质因数)

可以直接用高精度来暴力求。

也可以不用高精度:

把m分解质因数,记录每个因数和它的次数。然后计算每个因数在n的阶乘里出现了多少次,再把这个次数除以它在m中的次数,就是可能的k值。取最小的k。

#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<map>#include<set>#include<vector>#include<algorithm>#include<stack>#include<queue>using namespace std;#define INF 1000000000#define eps 1e-8#define pii pair<int,int>#define LL long long intint m,n,k,T;int prime[5005],vis[5005];void getprime(){    int num=0;    for(int i=2;i<5000;i++)    {        if(vis[i]==0) prime[num++]=i;        for(int j=i*i;j<5000;j+=i)        {            if(j%i==0) vis[j]=1;        }    }}int main(){    //freopen("in6.txt","r",stdin);    //freopen("out.txt","w",stdout);    getprime();    scanf("%d",&T);    for(int cas=1;cas<=T;cas++)    {        scanf("%d%d",&m,&n);        k=INF;        vector<pii>zhi;        for(int i=0;prime[i]<=m;i++)        {            int num=0;            while(m%prime[i]==0)            {                num++;                m/=prime[i];            }            if(num)            zhi.push_back(make_pair(prime[i],num));        }        for(unsigned int i=0;i<zhi.size();i++)        {            int t=zhi[i].first,num=0;            for(int j=n;j>=1;j--)            {                int jj=j;                while(jj%t==0)                {                    num++;                    jj/=t;                }            }            //cout<<‘k‘<<num<<endl;            k=min(k,num/(zhi[i].second));        }        printf("Case %d:\n",cas);        if(k)        printf("%d\n",k);        else            printf("Impossible to divide\n");    }    //fclose(stdin);    //fclose(stdout);    return 0;}

 

uva10780(分解质因数)