一本通OJ-不定方程
不定方程
题意
求方程:$$\dfrac{1}{x} + \dfrac{1}{y} = \dfrac{1}{n!}$$ 的正整数解的组数,答案对 \(10^9+7\) 取模。
分析
\(y=\frac{xn!}{x-n!}\)。设\(t=x-n!\)。那么\(y=n!+\frac{(n!)^2}{t}\)。所以\(t是(n!)^2\)的约数就可以。因为\(n!=p_{1}^{m_{1}}*p_{2}^{m_{2}}...*p_{n}^{m_{n}}\)。因而\((n!)^2=p_{1}^{2m_{1}}*p_{2}^{2m_{2}}...*p_{n}^{2m_{n}}\)。则\(ans=k=\prod\limits_{i=1}^n{2ci+1}\)。
代码
#include<iostream>
#include<cstdio>
using namespace std;
long long n, q;
long long s[6001000], c[6001000];
bool b[100000001];
void p(long long n)
{
for(long long i=2; i<=n; i++)
{
if(b[i]==0)
{
s[0]++;
s[s[0]]=i;
}
for(long long j=1; j<=s[0]&&i*s[j]<=n; j++)
{
b[i*s[j]]=1;
if(i%s[j]==0)
break;
}
}
}
int main()
{
scanf("%lld", &n);
long long m=1e9+7;
p(n);
for(long long i=1; i<=s[0]; i++)
for(long long j=s[i]; j<=n; j*=s[i])
c[i]=(c[i]+n/j)%m;
long long ans=1;
for(long long i=1; i<=s[0]; i++)
ans=ans*(c[i]*2+1)%m;
printf("%lld", ans);
return 0;
}