正题
题目链接:https://www.luogu.org/problemnew/show/P1445
题目大意
求有多少个x,yx,yx,y满足
1x+1y=1n!\frac{1}{x}+\frac{1}{y}=\frac{1}{n!}x1+y1=n!1
解题思路
x+yxy=1n!\frac{x+y}{xy}=\frac{1}{n!}xyx+y=n!1
n!(x+y)=xyn!(x+y)=xyn!(x+y)=xy
xy−n!(x+y)=0xy-n!(x+y)=0xy−n!(x+y)=0
xy−n!(x+y)+(n!)2=(n!)2xy-n!(x+y)+(n!)^2=(n!)^2xy−n!(x+y)+(n!)2=(n!)2
(x−n!)(y−n!)=(n!)2(x-n!)(y-n!)=(n!)^2(x−n!)(y−n!)=(n!)2
然后设a=x−n!,b=y−n!a=x-n!,b=y-n!a=x−n!,b=y−n!
所以求有多少个aaa和bbb就对了
然后n!=∏picin!=\prod p_i^{c_i}n!=∏pici
(n!)2=∏pi2∗ci(n!)^2=\prod p_i^{2*c_i}(n!)2=∏pi2∗ci
然后计算aaa个数就可以推出bbb了
答案就是∏(2∗ci+1)\prod (2*c_i+1)∏(2∗ci+1)
codecodecode
#include<cstdio>
#include<algorithm>
#include<cstring>
#define ll long long
using namespace std;
const ll XJQ=1e9+7,N=1e6+10;
ll n,ans=1,pri[N],cnt,c[N];
bool v[N];
void Prime(ll x)
{for(ll i=2;i<=x;i++){if(v[i]) continue;pri[++cnt]=i;for(ll j=i;j<=x;j+=i)v[j]=1;}
}
void Primes(ll n)
{ll l=0;for(ll i=1;i<=cnt;i++){if(pri[i]*pri[i]>n) break;if(n%pri[i]) continue;while(n%pri[i]==0)n/=pri[i],c[i]++;}if(n==1) return;int mark=lower_bound(pri+1,pri+1+cnt,n)-pri;c[mark]++;
}
int main()
{scanf("%lld",&n);Prime(n);for(ll i=2;i<=n;i++)Primes(i);for(ll i=1;i<=cnt;i++)(ans*=c[i]*2+1)%=XJQ;printf("%lld",ans);
}