题意:求一元不定方程1/x+1/y=1/n!
分析:一开始看着题的时候一点思路都没有,看了题解才发觉这题的脑洞蛮大的。
我们设z=n!
1/x+1/y=1/z
x=yz/(y-z)
设t=y-z
则x=z+(z^2)/t
那么题目就变成了求z^2的约数个数
那么只要线性筛搞一搞就可以了。
顺便吐槽一下这题居然连样例都没有……
在这里就附带一个样例好了
n=10
ans=2295
代码:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#define N 1000005
#define MOD 1000000007
#define ll long long
using namespace std;
int n,tot,f[N],not_prime[N],prime[N];
void get_prime(int n)
{
for (int i=2;i<=n;i++)
{
if (!not_prime[i]) prime[++tot]=i;
for (int j=1;j<=tot&&i*prime[j]<=n;j++)
{
not_prime[i*prime[j]]=1;
if (i%prime[j]==0) break;
}
}
}
int main()
{
scanf("%d",&n);
for (int i=2;i<=n;i++)
f[i]=i;
get_prime(n);
int ans=1;
for (int i=1;i<=tot;i++)
{
int s=0;
for (int j=prime[i];j<=n;j+=prime[i])
while (f[j]%prime[i]==0)
{
f[j]/=prime[i];
s++;
}
ans=(ll)ans*((ll)s*2%MOD+1)%MOD;
}
printf("%d",ans);
return 0;
}