题解【洛谷P1445】[Violet]樱花
我们首先对题目中的式子进行化简:
\[\begin{aligned}
\frac{1}{x} + \frac{1}{y} & = \frac{1}{n!} \\
y\times n! + x\times n! & = xy \\
(x - n!)\times y & = x\times n! \\
y & = \frac{x\times n!}{x - n!} \\
& = \frac{(x-n!+n!)\times n!}{x-n!} \\
& = \frac{(x-n!)\times n! + n!^2}{x - n!} \\
& = \frac{(x-n!)\times 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\) 的约数个数。
由唯一分解定理得:
\[\begin{aligned}
n! & = p_1^{c_1} \times p_2^{c_2} \times \dots \times p_k^{c_k} \\
n!^2 & = p_1^{2c_1} \times p_2^{2c_2} \times \dots \times p_k^{2c_k}
\end{aligned}\]
所以 \(n!^2\) 的约数个数就是 \((2c_1 + 1) \times (2c_2 + 1) \times \dots \times (2c_k+1)\)。
先考虑一下如何求出 \(n!\) 的约数个数。
我们考虑求出 \(1\sim n\) 中的每个质数 \(p\),\(n!\) 中质因子 \(p\) 的个数就等于 \(1\sim 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;
}