AcWing 1292. 哥德巴赫猜想 线性筛+二分查找
Posted karshey
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AcWing 1292. 哥德巴赫猜想 线性筛+二分查找相关的知识,希望对你有一定的参考价值。
题
线性筛代码:
const int N=1e6+10;
int pri[N],v[N],pri2[N];
int cnt;
void Getpri()//线性筛
{
mem(v,0);
cnt=0;
for(int i=2;i<=1e6;i++)
{
if(v[i]==0)//没被筛到说明是质数
{
v[i]=i;
pri[cnt++]=i;
}
for(int j=0;j<cnt;j++)
{
if(pri[j]>v[i]||pri[j]>1e6/i) break;
v[i*pri[j]]=pri[j];
}
}
}
总代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
#define pb push_back
#define fi first
#define se second
#define mem(a,x) memset(a,x,sizeof(a));
#define db double
#define fir(i,a,n) for(int i=a;i<=n;i++)
#define debug(x) cout<<#x<<" "<<x<<endl;
const int inf=0x3f3f3f3f;
const int MOD=1e9+7;
//重点是线性筛======================
const int N=1e6+10;
int pri[N],v[N],pri2[N];
int cnt;
void Getpri()//线性筛
{
mem(v,0);
cnt=0;
for(int i=2;i<=1e6;i++)
{
if(v[i]==0)//没被筛到说明是质数
{
v[i]=i;
pri[cnt++]=i;
}
for(int j=0;j<cnt;j++)
{
if(pri[j]>v[i]||pri[j]>1e6/i) break;
v[i*pri[j]]=pri[j];
}
}
}
int main()
{
int n;
Getpri();
sort(pri,pri+cnt);
// memcpy(pri2,pri,sizeof(pri));
// sort(pri2,pri2+cnt,cmp);
while(cin>>n&&n)
{
cout<<n<<" = ";
int t=n-3;
int t1=lower_bound(pri,pri+cnt,t)-pri;
int t2=1;
while(t1>t2)
{
if(pri[t1]+pri[t2]==n) break;
else if(pri[t1]+pri[t2]<n) t2++;
else t1--;
}
cout<<pri[t2]<<" + "<<pri[t1]<<endl;
}
return 0;
}
以上是关于AcWing 1292. 哥德巴赫猜想 线性筛+二分查找的主要内容,如果未能解决你的问题,请参考以下文章
Goldbach's Conjecture POJ - 2262 线性欧拉筛水题 哥德巴赫猜想