LOJ10202樱花——数论

题目描述

原题来自:HackerRank Equations

求不定方程:

 1/x+1/y=1/n!

的正整数解 (x,y) 的数目。

输入格式

一个整数 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,让后就是求所有因数的个数。

___________________________________________________________________

 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 }
View Code

猜你喜欢

转载自www.cnblogs.com/gryzy/p/11496229.html