我们首先对题目中的式子进行化简:
[egin{aligned}
frac{1}{x} + frac{1}{y} & = frac{1}{n!} \
y imes n! + x imes n! & = xy \
(x - n!) imes y & = x imes n! \
y & = frac{x imes n!}{x - n!} \
& = frac{(x-n!+n!) imes n!}{x-n!} \
& = frac{(x-n!) imes n! + n!^2}{x - n!} \
& = frac{(x-n!) imes n!}{x-n!} + frac{n!^2}{x - n!} \
& = n! + frac{n!^2}{x-n!}
end{aligned}]
因为 (x) 和 (y) 都是正整数,所以 (frac{n!^2}{x-n!}) 也一定是正整数。
于是问题就转化成了求 (n!^2) 的约数个数。
由唯一分解定理得:
[egin{aligned}
n! & = p_1^{c_1} imes p_2^{c_2} imes dots imes p_k^{c_k} \
n!^2 & = p_1^{2c_1} imes p_2^{2c_2} imes dots imes p_k^{2c_k}
end{aligned}]
所以 (n!^2) 的约数个数就是 ((2c_1 + 1) imes (2c_2 + 1) imes dots imes (2c_k+1))。
先考虑一下如何求出 (n!) 的约数个数。
我们考虑求出 (1sim n) 中的每个质数 (p),(n!) 中质因子 (p) 的个数就等于 (1sim n) 中每个数包含质因子 (p) 的个数之和。
最后在统一约数个数时转换一下即可。
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1000003, mod = 1000000007;
int n, m;
int pri[N], tot;
bool st[N];
inline void pre(int n)
{
for (int i = 2; i <= n; i+=1)
{
if (!st[i]) pri[++tot] = i;
for (int j = 1; pri[j] <= n / i; j+=1)
{
st[pri[j] * i] = true;
if (i % pri[j] == 0) break;
}
}
}
int main()
{
cin >> n;
pre(n); //先筛出 1~n 中所有的质数
LL ans = 1;
for (int i = 1; i <= tot; i+=1)
{
int p = pri[i], s = 0; //枚举 1~n 的每个质因子
for (int j = n; j; j/=p) s += j / p; //求出包含质因子 p 的个数之和
ans = (ans * 1ll * (2 * s + 1) % mod) % mod; //求出约数个数
}
cout << ans % mod << endl; //注意取模
return 0;
}