先令n! = a:

1 / x + 1 / y = 1 / a  =>  x = y * a / (y - a)

再令 k = y - a:

于是x = a + a ^ 2 / k  =>  k | a ^ 2

故等价于求a ^2的约数个数

素数筛一下什么的就好了嘛

 

 1 /**************************************************************
 2     Problem: 2721
 3     User: rausen
 4     Language: C++
 5     Result: Accepted
 6     Time:588 ms
 7     Memory:2408 kb
 8 ****************************************************************/
 9  
10 #include <cstdio>
11  
12 using namespace std;
13 typedef long long ll;
14 const int N = 1000005;
15 const int Cnt = 80005;
16 const int mod = 1000000007;
17  
18 int n;
19 bool F[N];
20 int cnt, p[Cnt], c[Cnt];
21 ll ans = 1;
22  
23 int main() {
24     int i, j, t;
25     scanf("%d\n", &n);
26     for (i = 2; i < N; ++i) {
27         if (!F[i]) p[++cnt] = i;
28         for (j = 1; j <= cnt && p[j] * i < N; ++j) {
29             F[p[j] * i] = 1;
30             if (p[j] % i == 0) break;
31         }
32     }
33     for (i = 1; i <= cnt; ++i)
34         for (j = p[i]; j <= n; j += p[i])
35             for (t = j; t % p[i] == 0; t /= p[i]) ++c[i];
36     for (i = 1; i <= cnt; ++i)
37         (ans *= (c[i] << 1 | 1)) %= mod;
38     printf("%lld\n", ans);
39     return 0;
40 }
View Code

 

posted on 2014-12-02 18:58  Xs酱~  阅读(748)  评论(0编辑  收藏  举报