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 线性欧拉筛水题 哥德巴赫猜想

模板莫比乌斯反演(ACWing215)

算法模板:数论之质数全家桶(内含埃氏筛法,欧拉线性筛法详解)沈七

ACM_哥德巴赫猜想(素数筛)

AcWing - 197 - 阶乘分解