bzoj2721 / 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 }