首先就是对公式的转化为(x+y)*(n!)=xy
然后变形为(n!)^2-(x+y)*(n!)+xy=0;
最后利用交叉相乘变形为(x-n!)(y-n!)=(n!)^2;
因为x>n! && y>n! 所以我们将x-n! 和 y-n!整体代换为a和b
这个时候就会发现a和b必定是(n!)^2的因子;
利用唯一分解定理,找出a合法的答案,每一个a必定确定一个b
这个时候就需要求n!的素数因子以及每个因子的个数,然后每个因子的两倍+1乘起来既是答案
1 /* P1445 2019/4/20 */ 2 3 #include<bits/stdc++.h> 4 5 const int MOD=(int)1e9+7; 6 const int MAXN=(int)1e6; 7 8 bool vis[MAXN]; 9 10 void prime(int N){ 11 memset(vis,true,sizeof(vis)); 12 vis[0]=vis[1]=false; 13 for(int i=2;i<=N;i++) 14 { 15 if(!vis[i]) continue; 16 int base=2; 17 while(i*base<=N) vis[i*base]=false,base++; 18 } 19 } 20 21 int main(){ 22 int n; 23 std::cin>>n; 24 prime(n); 25 long long ans=1; 26 for(int i=1;i<=n;i++) 27 { 28 long long tmp=0; 29 if(vis[i]) 30 { 31 int now=n; 32 while(now) tmp+=now/i,now/=i; 33 ans=(ans*(2*tmp+1))%MOD; 34 } 35 } 36 std::cout<<ans; 37 return 0; 38 }