【题目链接】
【算法】
令n!=z,因为1 / x + 1 / y = 1 / z,所以x,y>z,不妨令y = z + d
则1 / x + 1 / (z + d) = 1 / z
1 / x = 1 / z - 1 / (z + d)
1 / x = d / (z + d)z
x = z(z + d) / d = z^2 / d + z
因为x是正整数,所以z^2 / d是正整数,所以d | z^2
问题就转化为了求z^2的约数个数
约数个数定理 x = p1^k1p2^k2....pn^kn,(p1,p2,....pn)为质数,x的约数个数为(k1+1)(k2+1)...(kn+1)
分解质因数即可
【代码】
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 1e6;
const int MOD = 1e9 + 7;
ll N,i,k,ans=1,tot=0;
ll prime[MAXN+10],f[MAXN+10],sum[MAXN+10];
template <typename T> inline void read(T &x) {
ll f=1; x=0;
char c = getchar();
for (; !isdigit(c); c = getchar()) { if (c == '-') f = -f; }
for (; isdigit(c); c = getchar()) x = x * 10 + c - '0';
x *= f;
}
template <typename T> inline void write(T x) {
if (x < 0) { putchar('-'); x = -x; }
if (x > 9) write(x/10);
putchar(x%10+'0');
}
template <typename T> inline void writeln(T x) {
write(x);
puts("");
}
inline void sieve(ll n) {
ll i,j,tmp;
for (i = 2; i <= n; i++) {
if (!f[i]) prime[++tot] = f[i] = i;
for (j = 1; j <= tot; j++) {
tmp = i * prime[j];
if (tmp > n) break;
f[tmp] = prime[j];
if (f[i] == prime[j]) break;
}
}
}
inline void calc(ll x) {
while (x != 1) {
sum[f[x]]++;
x /= f[x];
}
}
int main() {
read(N);
sieve(N);
for (i = 1; i <= N; i++) calc(i);
for (i = 1; i <= tot; i++) ans = ans * (2 * sum[prime[i]] + 1) % MOD;
writeln(ans);
return 0;
}