完全平方数

源代码:

#include<cstdio>
#define LL long long
#define INF 100000007LL
LL n,Num(0),Ans=1,Sum[350000]={0},Prime[350000];
bool Flag[5000001]={0};
LL Count(LL S,LL X) //快速幂。
{
    LL Number=1;
    while (S)
    {
        if (S&1)
          Number=(Number*X)%INF;
        X=(X*X)%INF;
        S>>=1;
    }
    return Number;
}
void Euler() //欧拉筛法。
{
    for (LL a=2;a<=n;a++)
    {
        if (!Flag[a])
          Prime[Num++]=a;
        for (LL b=0;b<Num&&a*Prime[b]<=n;b++)
        {
            Flag[a*Prime[b]]=true;
            if (!(a%Prime[b]))
              break;
        }
    }
}
int main()
{
    scanf("%lld",&n);
    Euler();
    for (LL a=0;a<Num;a++) //那个方法。
    {
        LL t=n;
        while (t)
        {
            Sum[a]+=t/Prime[a];
            t/=Prime[a];
        }
    }
    for (LL a=0;a<Num;a++)
      if (Sum[a]&1) //完全可以用素数独苗来填补空缺。
        Ans=(Ans*Count(Sum[a]-1,Prime[a]))%INF;
      else
        Ans=(Ans*Count(Sum[a],Prime[a]))%INF;
    printf("%lld",Ans);
    return 0;
}

/*
    从1~N中选若干个数相乘,使其形成解,可以转化为:从1~N中选若干个数,作为N!的约数。
    阶乘分解质因数后,会发现规律。
*/
原文地址:https://www.cnblogs.com/Ackermann/p/6012583.html