bzoj2721 / P1445 [Violet]樱花

P1445 [Violet]樱花

显然$x,y>n$

那么我们可以设$a=n!,y=a+t(t>0)$

再对原式通分一下$a(a+t)+ax=x(a+t)$

$a^{2}+at+ax=ax+tx$

$x=a^{2}/t+a$

$x=(n!)^{2}/t+n!$

再根据唯一分解定理

$(n!)^{2}=q_{1}^{p_{1}}*q_{2}^{p_{2}}*q_{3}^{p_{3}}*......*q_{m}^{p_{m}}$

将$(n!)^{2}$分解质因数一下

最后乘法原理套上去

end.

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #define re register
 5 using namespace std;
 6 #define N 1000002
 7 const int mod=1e9+7;
 8 int n,v[N],pri[N],cct,ans=1;
 9 int main(){
10     scanf("%d",&n);
11     for(re int i=2;i<=n;++i){
12         if(!v[i]) v[i]=pri[++cct]=i;
13         for(re int j=1;j<=cct;++j){
14             if(pri[j]>i||pri[j]*i>n) break;
15             v[pri[j]*i]=pri[j];
16         }
17     }
18     for(re int i=1;i<=cct;++i){
19         long long cnt=0;
20         for(re int j=n;j;j/=pri[i]) cnt+=j/pri[i];
21         cnt=cnt<<1|1;
22         ans=1ll*ans*cnt%mod;
23     }printf("%d",ans);
24     return 0;
25 }
View Code

 

posted @ 2018-11-02 01:08  kafuuchino  阅读(162)  评论(0编辑  收藏  举报