方程 1/X+1/Y=1/(N!) 的正整数解的组数,其中N≤10^6。
解的组数,应模1e9+7。
输入格式
输入一个整数N
输出格式
输出答案
输入输出样例
输入 #1
1439
输出 #1
102426508
【解题思路】
1/x+1/y=1/n!
先通分
(x+y)/xy=1/n!
再化整数
xy-(x+y)*n!=0
然后配平
(n!)^2-(x+y)*n!+xy=(n!)^2
最后
(x-n!)*(y-n!)=(n!)^2
然后我们发现x,y都要是正整数;
所以原题可以变为
A*B=(n!)^2;
当A*B为正整数的时候x,y显然也是正整数;
然后我们考虑x的取值,显然,若一个质数p有k个,那么x可以取p^0,p^1....p^k 共(k+1)种情况
乘法原理乘起来就可以了
而且显然,x确定后,y必然也会被确定
那么我们先可以欧拉筛;
求出每个数的最小质因数然后大力
【code】
1 #include <iostream>
2 #include <cstdio>
3 #include <cstring>
4 #include <cmath>
5 #include <algorithm>
6 using namespace std;
7 inline int read(){
8 int s = 0, w = 1;
9 char ch = getchar();
10 while(ch < '0' || ch > '9'){if(ch == '-')w = -1;ch = getchar();}
11 while(ch >= '0' && ch <= '9') s = s * 10 + ch - '0',ch = getchar();
12 return s * w;
13 }
14 const int mod=1000000007;
15 int n,m;
16 int c[1000010], v[1000010], p[1000010];
17 int ans = 1;
18 inline void GetPrime(){
19 memset(v,false,sizeof(v));
20 for(register int i=2;i<=n;i++){
21 if(!v[i]){
22 p[++m]=i;
23 v[i]=i;
24 }
25 for(register int j=1;j<=m;j++){
26 if(i*p[j]>n)break;
27 v[i*p[j]]=p[j];
28 if(i%p[j]==0)break;
29 }
30 }
31 }
32 int main(){
33 n = read();
34 GetPrime();
35 for(register int i=1;i<=n;i++){
36 for(register int j=i;j!=1;j/=v[j])
37 c[v[j]]++;
38 }
39 for(register int i=1;i<=n;i++)
40 ans=(long long)ans*(c[i]<<1|1) % mod;
41 printf("%d\n", ans);
42 return 0;
43 }