HDU 3823 埃式筛法打表
Posted edviv
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 3823 埃式筛法打表相关的知识,希望对你有一定的参考价值。
题意:有T个样例,每个样例输入两个数 a 和 b,让你找到一个数,使得 a + x = c, b + x = d, c 和 d
是质数并且相邻。
解法:打素数表(埃式筛法)
不成立: (b - a)&1
或 b == a
成立:
特殊: a = 1 , b = 2, ans = 1;
a = 2, b = 3, ans = 0;
(c != a, d != b, b - a = d - c ) && b <= d, ans = d - b;
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std; const int N = 2e7 + 7; bool vis[N]; int primes[N]; int idx; int T,a,b; void prime() //打表 { memset(vis,0,sizeof(vis)); idx = 0; for(int i = 2; i < N; i++) { if(!vis[i]) { primes[idx] = i; idx++; for(int j = 2*i; j < N; j += i) vis[j] = true; } } } int main() { int s = 0; prime(); scanf("%d",&T); while(T--) { s++; scanf("%d%d",&a,&b); if(a>b) swap(a,b); int c = b - a; int t = 0; if(a == 1 && b == 2) { printf("Case %d: %d ",s,1); continue; } if(a == 2 && b == 3) { printf("Case %d: %d ",s,0); continue; } if(c & 1 || a == b) { printf("Case %d: %d ",s,-1); continue; } else { for(int i = 1; i < idx; i++) { t = primes[i] - primes[i-1]; if(t == c && b <= primes[i]) { printf("Case %d: %d ",s,primes[i]-b); break; } } } } return 0; }
以上是关于HDU 3823 埃式筛法打表的主要内容,如果未能解决你的问题,请参考以下文章