Particle

競技プログラミングについての雑記

AOJ 0056: Goldbach's Conjecture

できるだけ、実行時間を短くしてみようとしました。コードも少しだけ短めにしました。
偶数を除いて普通にエラトステネスの篩を使って、(素数+素数)を全部計算しただけですが、可読性のことは全く考えていません。ごめんなさい。

あと、if文って結構時間が掛かるみたいですね。

#include <cstdio>

int P[25000],G[50001],i,j;//P[i]=prime[2*i+1]

int main(){
	for(i++; i < 25000; i++){
		if(!P[i]){
			for(j = i*3; j < 24999; j += i<<1){
				P[++j]=1;
			}
		}
	}
	G[4]++;
	for(j = 1; j < 24999; j++){
		G[2*j+3]+=(!P[j]);
	}
	for(i = 1; i < 25000; i++){
		if(!P[i]){
			for(j = i; j < 25000-i; j++){
				G[(i+j+1)<<1]+=(!P[j]);
			}
		}
	}
	while(std::scanf("%d",&i),i){
		std::printf("%d\n",G[i]);
	}
	return 0;
}