bzoj2721樱花——质因数分解

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2721

可以知道 x 和 y 一定都大于 n! ,不妨把 y 表示为 n!+t ;

那么 1/x + 1/y = 1/x + 1/(n!+t) = 1/n! ;

整理一下,最终变成:x = (n!)²/t + 1 ;

于是问题转化为求有多少个 t 让 x 是整数,也就是 (n!)² 的约数个数;

用质因数分解求,筛素数什么的......

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int const maxn=1e6+5;
int n,pri[maxn],mn[maxn],cnt[maxn],ct;
long long ans,mod=1e9+7;
void init()
{
    mn[1]=1;//
    for(int i=1;i<=n;i++)
    {
        if(!mn[i])pri[++ct]=i,mn[i]=i;
        for(int j=1;j<=ct&&i*pri[j]<=n;j++)
        {
            mn[i*pri[j]]=pri[j];
            if(i%pri[j]==0)break;
        }
    }
}
void cal(int x)
{
    while(x!=1)
    {
        cnt[mn[x]]++;
        x/=mn[x];
    }
}
int main()
{
    scanf("%d",&n);
    init();
    while(n)cal(n),n--;
    ans=1;
    for(int i=1;i<=ct;i++)
        (ans*=(2*cnt[pri[i]]+1))%=mod;
    printf("%lld",ans);
    return 0;
}

 

posted @ 2018-05-31 23:04  Zinn  阅读(261)  评论(0编辑  收藏  举报