Goldbach's Conjecture LightOJ - 1259
考察:素数筛
错误思路:
筛出1e7的素数后,upper_bound找到n/2的位置,lower_bound找+prime[i]==n,的prime[idx],找到后判断是否和为n,是就ans++
此思路会TLE...
正确做法:
在找与+prime[i]=n的素数,不用lower_bound,因为之前的st素数已经把那些不是素数的数筛出来了.....
本蒟蒻真的好fw
1 #include <iostream> 2 #include <algorithm> 3 using namespace std; 4 typedef long long ll; 5 const int N = 1e7+10; 6 int cnt,prime[N/10]; 7 bool st[N]; 8 void GetPrime(int n) 9 { 10 st[1] = st[0] = 1; 11 for(int i=2;i<=n;i++) 12 { 13 if(!st[i]) prime[++cnt] = i; 14 for(int j=1;prime[j]<=n/i;j++) 15 { 16 st[i*prime[j]] = 1; 17 if(i%prime[j]==0) break; 18 } 19 } 20 } 21 int main() 22 { 23 GetPrime(10000000); 24 int T,kcase = 0; 25 scanf("%d",&T); 26 while(T--) 27 { 28 int n,ans = 0; scanf("%d",&n); 29 int k = upper_bound(prime+1,prime+cnt+1,n/2)-prime; 30 for(int i=1;i<k;i++) 31 if(!st[n-prime[i]]) ans++; 32 printf("Case %d: %d\n",++kcase,ans); 33 } 34 return 0; 35 }