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 }

 

posted @ 2021-01-26 11:42  acmloser  阅读(50)  评论(0编辑  收藏  举报