Luogu
算法
思路
对于原式做如下推导:
x1+y1xyx+yn!⋅(x+y)n!⋅x+n!⋅y−xyxy−n!⋅x−n!⋅y=n!1=n!1=xy=0=0
由上式联想到:
(a−x)(b−x)→ab−ax−bx−X2
比较两式,发现缺少 (n!)2 项。加上 (n!)2,得:
(x−n!)(y−n!)=(n!)2
由于等式左边是乘积的形式,所以 (x−n!) 和 (y−n!) 必定是 (n!)2 的一对因子。
将 n 质因数分解:
n=i=0∏kpiαi
对于 n! 的因子个数 sum1 有:
sum1=i=0∏k(αi+1)
而 (n!)2 的因子个数 sum2 为:
sum2=i=0∏k(α1⋅2+1)
根据乘法原理,最后的答案为所有 sum2 的乘积。
代码
#include <bits/stdc++.h>
using namespace std;
constexpr int MOD = 1e9 + 7;
inline vector<int> GetPrimes(int Limit) { vector<int> primes; vector<bool> mark(Limit + 1); for (int i = 2; i <= Limit; i ++) { if (mark[i] == false) { primes.emplace_back(i); } for (int j = 0; i * primes[j] <= Limit; j ++) { mark[i * primes[j]] = true; if (i % primes[j] == 0) { break; } } } return primes; }
int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); int n; cin >> n; vector<int> primes = GetPrimes(n); long long answer = 1; for (auto&& p : primes) { int alpha = 0, number = n; while (number) { alpha += number / p; number /= p; } answer = (answer * (alpha + alpha + 1) % MOD) % MOD; } cout << answer % MOD << '\n'; return 0; }
|