LOJ10202樱花——数论
题目描述
输入格式
一个整数 n 。
输出格式
一个整数,表示有多少对 (x,y) 满足题意。答案对 1e9+7 取模。
样例
样例输入
2
样例输出
3
样例说明
共有三个数对 (x,y) 满足条件,分别是 (3,6),(4,4) 和 (6,3)。
数据范围与提示
对于 30% 的数据,n<=100;
对于全部数据,n<=1e6。
___________________________________________________________________
数论题,关键一步真的想不到!
由于题目是正整数解,所以x,y都大于n
题目很容易化为n!=xy/(x+y)
由于x,y大于n!。所以x设为n!+a,y设为n!+b。
上面的式子就可以化为(n!)^2=a*b
也就是上面的式子,a,b有多少中解!
所以,首先求出n中的质数,然后求出所有的质数在n!中出现的次数,而(n!)^2中的后的质数的个数要乘以2,让后就是求所有因数的个数。
___________________________________________________________________
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=1e6; 4 int n; 5 int prime[maxn],cnt[maxn]; 6 bool sz[maxn]; 7 int js; 8 void getprime(int n) 9 { 10 sz[0]=sz[1]=1; 11 for(int i=2;i<=n;++i) 12 { 13 if(sz[i]==0)prime[js++]=i; 14 for(int j=0;j<js&&prime[j]*i<=n;++j) 15 { 16 sz[prime[j]*i]=1; 17 if(i%prime[j]==0)break; 18 } 19 } 20 } 21 void fenjie(int x) 22 { 23 for(int i=0;prime[i]*prime[i]<=x;++i) 24 while(x%prime[i]==0) 25 { 26 x/=prime[i]; 27 cnt[prime[i]]++; 28 } 29 if(x!=1)cnt[x]++; 30 } 31 long long ans=1; 32 int main() 33 { 34 cin>>n; 35 getprime(n); 36 for(int i=2;i<=n;++i)fenjie(i); 37 for(int i=2;i<=n;++i)ans=(ans*((cnt[i]<<1)+1))%1000000007; 38 cout<<ans; 39 return 0; 40 }