Luogu1445 [Violet]櫻花
阿新 • • 發佈:2020-07-23
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; }