题解【洛谷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;
}
posted @ 2020-03-15 20:09  csxsi  阅读(250)  评论(0编辑  收藏  举报