题目传送门
题目大意:
求解一个形如
[frac1x+frac1y=frac1{n!}
]
的方程正整数解(x,y)的个数。
显然$ x,y>n!$
那么我们可以设(y=n!+d)
则:
[frac1x+frac1y=frac1{n!}
]
[xn!+yn!=xy
]
[(x+y)n!=xy
]
[(x+d+n!)n!=x(n!+d)
]
[x=frac{n!}d+n!
]
所以:我们要找(x)的正整数解,既要找出来正整数(d)使得(x)也是正整数。显然,这就是找((n!)^2)的所有正约数.
然后就暴力就好辣qwq
还有一个不知道叫什么名的定理就是一个数(x)的约数个数(d=)
把(x)质因数分解,写成
[x=Pi_{i=1}^{k}p_i^{c_i}
]
(p是质数,k是x的质因数个数,重复不计)
的形式。
那么,x的约数个数为
[Pi_{i=1}^{k}(c_i+1)
]
emmmmmm,我这种蒟蒻是肯定不会证的(大雾
Code
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
typedef long double ld;
const ll N = 1e6+1;
const ll inf = 2147483647;
const ll mod = 1e9+7;
const double eps = 1e-5;
ll n;
ll ans=1;
ll c[N],p[N];
ll vis[N],m[N];
int cnt;
inline void readx(ll &x)
{
x=0;
int s=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')
s=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=(x<<1)+(x<<3)+ch-'0';
ch=getchar();
}
x*=s;
}
inline void screen()
{
for(int i=2;i<=n;++i)
{
if(!vis[i])
{
p[++cnt]=i;
m[i]=cnt;
}
for(int j=1;j<=cnt&&p[j]*i<=n;++j)
{
vis[i*p[j]]=1;
m[i*p[j]]=j;// m[i] 表示 i 的最小质因子
if(i%p[j]==0) break;
}
}
}
inline void solve(int x)
{
while(x!=1)
{
++c[m[x]];
x/=p[m[x]];
}
}
int main()
{
readx(n);
screen();
for(int i=1;i<=n;++i)
solve(i);
for(int i=1;i<=N;++i)
if(c[i])
ans=ans*(c[i]*2+1)%mod;
printf("%lld
",ans);
return 0;
}