1. 程式人生 > 實用技巧 >Luogu1445 [Violet]櫻花

Luogu1445 [Violet]櫻花

https://www.luogu.com.cn/problem/P1445

數論

\[\frac{1}{x}+\frac{1}{y}=\frac{1}{n!} \\ (x+y)n!=xy\\ xy-(x+y)n!+(n!)^2=(n!)^2\\ (x-n!)(y-n!)=(n!)^2\\ 令a=x-n!,b=y-n!\\ ab=(n!)^2 \]

計算每個數的因數種類、個數,可以每次除以它的最小質因數,複雜度\(1\)\(log\)

從而計算\((n!)^2\)的因數個數

\(C++ Code:\)

#include<cstdio>
#include<iostream>
#include<algorithm>
#define mod 1000000007
#define N 1000005
#define ll long long
using namespace std;
int n,cnt,prime[N],c[N];
bool pri[N];
ll ans[N];
int main()
{
    scanf("%d",&n);
    for (int i=2;i<=n;i++)
    {
        if (!pri[i])
        {
            prime[++cnt]=i;
            c[i]=i;
        }
        for (int j=1;j<=cnt;j++)
        {
            ll g=(ll)i*prime[j];
            if (g>n)
                break;
            pri[g]=true;
            c[g]=prime[j];
            if (i%prime[j]==0)
                break;
        }
    }
    for (int i=1;i<=n;i++)
    {
        int k=i;
        while (k^1)
        {
            ans[c[k]]++;
            k/=c[k];
        }
    }
    ll o=1;
    for (int i=1;i<=n;i++)
        o=o*(ans[i]+ans[i]+1)%mod;
    cout << o << endl;
    return 0;
}