线性筛

xiaoxiao2021-02-28  34

http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=26

孪生素数问题

时间限制: 3000  ms  |  内存限制: 65535  KB 难度: 3 描述 写一个程序,找出给出素数范围内的所有孪生素数的组数。一般来说,孪生素数就是指两个素数距离为2,近的不能再近的相邻素数。有些童鞋一看到题就开始写程序,不仔细看题,咱们为了遏制一下读题不认真仔细的童鞋,规定,两个素数相邻为1的也成为孪生素数。 输入 第一行给出N(0<N<100)表示测试数据组数。 接下来组测试数据给出m,表示找出m之前的所有孪生素数。 (0<m<1000000) 输出 每组测试数据输出占一行,该行为m范围内所有孪生素数组数。 样例输入 1 14 样例输出 4 来源 [hzyqazasdf]原创 上传者 hzyqazasdf #include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <cmath> #include <vector> #include <map> #include <set> #include <queue> #include <stack> #define INF 0x3f3f3f3f #define MOD 1000000000+7 using namespace std; const int maxn = 1000000+10; bool f[maxn]; long long p[maxn],k; void check() { f[0]=1; f[1]=1; for(int i=2; i<=maxn; i++) { if(!f[i]) p[k++]=i; for(int j=0; p[j]*i<=maxn&&j<k; j++) { f[p[j]*i]=1; if(!(i%p[j])) break; } } } int main() { check(); int t,n; scanf("%d",&t); while(t--) { scanf("%d",&n); int cnt=0; for(int i=2; i<=n; i++) { if(f[i]!=1&&f[i-1]!=1) cnt++; if(f[i]!=1&&f[i-2]!=1) cnt++; } cout<<cnt<<endl; } }
转载请注明原文地址: https://www.6miu.com/read-2623034.html

最新回复(0)