洛谷10月月赛R1·浴谷八连测R1·提高组 T1

来源:互联网 发布:java保存字符串到文件 编辑:程序博客网 时间:2024/05/18 00:18

思路很简单,先对k分解质因数,存入一个数组中去。
然后对于n的阶乘分解那个数组的质因数,除数量,取最小值!
刚开始忘特判tot==0,ans开的不够大!

更快更稳定的方法RHO大质数分解,我懒的打了。
不会的可以参考我之前的BLOG(求一个很大数的欧拉函数)

#include <cstdio>#include <iostream>#define ll long longusing namespace std;const int maxm=1e7;ll prime[maxm],cnt;bool vis[maxm];ll z[maxm],num[maxm],tot;void pre(){    vis[1]=1;    for(int i=2;i<=1e7;i++)    {        if(!vis[i])         prime[++cnt]=i;        for(int j=1;j<=cnt&&i*prime[j]<=maxm;j++)         {            vis[i*prime[j]]=1;            if(i%prime[j]==0)             break;         }    }}int main(){    pre();    ll n,k;    scanf("%lld%lld",&n,&k);    for(int j=1;j<=cnt&&k!=1;j++)    {        if(prime[j]>n) break;        if(k%prime[j]==0)         {            z[++tot]=prime[j];            while(k%prime[j]==0)             k/=prime[j],num[tot]++;         }    }    ll ans=1e17;    for(int i=1;i<=tot;i++)    {        ll t=n;        ll sum=0;        while(t)        {            t/=z[i];            sum+=t;        }        //printf("%lld\n",sum);        ans=min(ans,1ll*sum/num[i]);    }    ll w=1e17;    if(ans==w) ans=0;    /*printf("%lld\n",tot);    for(int i=1;i<=tot;i++)     printf("%lld %lld\n",z[i],num[i]);*/    printf("%lld",ans);} 
阅读全文
1 0