[BZOJ2721]樱花 阶乘标准分解式

来源:互联网 发布:系统数据流程图 编辑:程序博客网 时间:2024/04/30 11:35

首先根据并联电路电阻的关系(逃,得到y>n!。
设y=n!+d,解得x=(n!)^2/d+d,所以只要d|n!即可。
于是筛出素数,n!中素因子pi的次数为[n/p]+[n/p^2]+[n/p^3]….,按这个方法对n!分解。最终答案即为n!的因数个数,为Π(2*pi+1)。
代码:

#include<iostream>#include<cstdio>using namespace std;const int mod=1000000007;int n,pri[100010],c[100010],num=0;bool flag[1000010];void getpri(int n){    flag[1]=1;    for(int i=2;i<=n;i++)    {        if(!flag[i]) pri[++num]=i;        for(int j=1;j<=num&&i*pri[j]<=n;j++)        {            flag[i*pri[j]]=1;            if(i%pri[j]==0) break;        }    }}int main(){    scanf("%d",&n);    getpri(n);    long long ans=1;    for(int i=1;i<=num;i++)    {        int tmp=n;        while(tmp) {c[i]+=tmp/pri[i]; tmp/=pri[i];}        c[i]=((c[i]<<1)|1);        ans=ans*c[i]%mod;    }    printf("%lld",ans);    return 0;}
原创粉丝点击