Violet

求解的合法的x和y的解的个数,答案%(1e9+7)

首先就是对公式的转化为(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 }

猜你喜欢

转载自www.cnblogs.com/rign/p/10740056.html