hdu-2886 Special Prime---数论推导

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=2866

题目大意:

问你1到L中有多少个素数满足n^3 + p*n^2 = m^3(其中n,m为大于1的自然数)

解题思路:

首先简化成n^2 *( n + p ) = m^3 

假设 n^2 和 n+p 之间有公共素因子 p , 那么 n+p = k*p , 即 n=p*(k-1),

带进去得到 p^3 * (k-1)^2 *k = m^3 , (k-1)^2*k 肯定是不能表示成某一个数的三次幂的,

所以假设不成立,所以 n^2 和 n+p 之间没有公共素因子 p ,
 那么可以假设n=x^3 , n+p=y^3 , 相减得到 p = y^3 - x^3 = (y-x) *(y^2+y*x+x^2) ,  p是素数,
所以 y-x=1 (这不用过多解释了吧,素数的因子只有1和P,右括号肯定是大于1的数了)

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 ll n, m;
 5 const int maxn = 1000000+10;
 6 int prime[maxn];
 7 bool is_prime[maxn];
 8 int sieve(int n)//返回n以内素数的个数
 9 {
10     int p = 0;
11     for(int i = 0; i <= n; i++)is_prime[i] = 1;
12     is_prime[0] = is_prime[1] = 0;
13     for(ll i = 2; i <= n; i++)
14     {
15         if(is_prime[i])
16         {
17             prime[p++] = i;
18             for(ll j = i * i; j <= n; j += i)is_prime[j] = 0;//这里涉及i*i,必须使用long long
19         }
20     }
21     return p;
22 }
23 int ans[maxn];
24 int main()
25 {
26     sieve(1000000);
27     for(int i = 1; ; i++)
28     {
29         int t = 3 * i * i + 3 * i + 1;
30         if(t > 1000000)break;
31         if(is_prime[t])ans[t] = 1;
32     }
33     for(int i = 1; i < maxn; i++)
34         ans[i] += ans[i - 1];
35     while(cin >> n)
36         if(ans[n])cout<<ans[n]<<endl;
37         else cout<<"No Special Prime!"<<endl;
38     return 0;
39 }

 

posted @ 2018-05-13 22:06  _努力努力再努力x  阅读(148)  评论(0编辑  收藏  举报