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 }
越努力,越幸运