洛谷10月月赛R1·浴谷八连测R1·提高组 SAC E#1 -T1 一道中档题 Factorial

来源:互联网 发布:淘宝卖的鹿茸是真的吗 编辑:程序博客网 时间:2024/05/21 19:24

题目大意:求n!在k进制下末尾0的个数。
做法:我们对k进行质因数分解,然后用k的质因数去除 n!,然后取num2/num1的最小值就可以了。
看数据范围,对k的质因数分解是要用rho大整数分解来做的,然而数据好像比较弱,筛到1e7就可以过的QAQ。
对于rho的应用见我前边一篇博客 欧拉函数专项

#include<iostream>#include<cstring>#include<cstdio>#include<vector>#define LL long longusing namespace std;LL n,k,ans,cnt,m,MOD;bool np[10000009];LL prime[10000009],num[10000009],q[10000009],r;void su(){    np[1]=1,np[0]=1;    for(int i=2;i<=10000001;i++)    {        if(!np[i]) prime[++cnt]=i;        for(int j=1;j<=cnt&&1ll*(prime[j]*i)<=10000001;j++)        {            np[i*prime[j]]=1;            if(i%prime[j]==0) break;        }    }}void pre(){    LL p=k;    for(int i=1;i<=cnt;i++)    {        LL x=prime[i],f=0;        while(p%x==0&&p)        {            p/=x;            num[x]++;            f=1;        }        if(f) q[++r]=prime[i];        if(!p) break;    }}LL count(LL x){    LL s=0,p=x;    while(p<=n)    {        s+=n/p;        p*=x;    }    return s;}int main(){    scanf("%lld%lld",&n,&k);    su();    pre();    ans=1e18;    for(int i=1;i<=r;i++)    {        ans=min(ans,count(q[i])/num[q[i]]);    }    if(ans==1e18) ans=0;    printf("%lld",ans);    return 0;}
原创粉丝点击