100000000 - projecteuler_0_tip

欧拉计划系列问题将会有效的提升你的解题思维、编码能力,帮助你掌握基本公式、基本原理,学会如何运用。不要通过暴力求解来完成;也不要没经过自己分析就查看提示。在这里你将学到一些有趣的东西,它们要比你之前学的深入一些,例如:利用除了2、3以外的质数它们都可以表示成6×k±1的形式这一特点,可以将单个素数判断优化到耗时只有1/5左右:

#include<bits/stdc++.h>
using namespace std;

bool ss1(int n){
	if(n<=1)return false;
	for(int i=2;i<=sqrt(n);i++){
		if(n%i==0) return false;
	}
	return true;
}

bool ss(int n){
	if(n<=3)return n>1;
	//6(x+1)-1=6x+5
	if((n%6!=1)&&(n%6!=5)) return false;
	int mx=sqrt(n);
	//6x-1遍历一次,6x+1遍历一次,所以 
	//遍历全部素数需要两次:i=5和i=7 
	for(int i=5;i<=mx;i+=6){
		if(n%i==0||n%(i+2)==0)return false;  
	}
	return true;	
} 

int main(){
	long long k=1e6,t=clock();
	for(int i=2;i<=k;i++){
		ss1(i);
	}
	cout<<clock()-t<<endl;
	t=clock();
	for(int i=2;i<=k;i++){
		ss(i);
	}
	cout<<clock()-t;
	return 0;
}

通常情况下,这些题目只需要你输出结果,但你应该提交你的代码来检测它的效率如何。

通常情况下,这些题目会有若干个不同的输入,每个输入对应一个测试点,其中第一个测试点是原题的数据。

通常情况下,朴素算法可以通过第一个测试点,但后面的若干测试点是无法通过的。

例如第一题(3或5的倍数)会有两个测试点,其中第一个为n=1000,第二个为n=1000000,第三个为n=1000000000。

输入

输出

样例

输入


                

输出


                
时间限制 1000 毫秒
内存限制 128 MB
统计
上一题 下一题