就是大区间求素数 参考
LightOJ - 1197
https://www.cnblogs.com/WTSRUVF/p/9190660.html
直接套那个代码就好了
#include <iostream> #include <cstdio> #include <sstream> #include <cstring> #include <map> #include <set> #include <vector> #include <stack> #include <queue> #include <algorithm> #include <cmath> #define MOD 2018 #define LL long long #define ULL unsigned long long #define Pair pair<int, int> #define mem(a, b) memset(a, b, sizeof(a)) #define _ ios_base::sync_with_stdio(0),cin.tie(0) using namespace std; const int maxn = 2 * 1e9; int primes[46350]; bool vis[maxn+10]; int ans = 0; vector<int> G; void init() { mem(vis,0); vis[1] = 1; for(int i=2; i<=46340; i++) if(!vis[i]) { primes[ans++] = i; for(LL j=(LL)i*i; j<=46340; j+=i) vis[j] = 1; } } int main() { init(); int T; int kase = 0; LL a, b, u, s; cin>> T; while(T--) { G.clear(); int res = 0; mem(vis,0); cin>> a >> b >> u >>s; // if(a <= 2) a = 2; int len = b - a; for(int i=0; i<ans && primes[i] * primes[i] <= b; i++) { int j = a/primes[i]; if(j*primes[i] < a) j++; if(j <= 1) j++; while(j*primes[i] <= b) { vis[j*primes[i] - a] = 1; j++; } } if(a == 1) vis[0] = 1; for(int k=0; k<=len; k++) if(!vis[k] && a + k > 1) G.push_back(a+k); for(int i=0; i + u - 1<G.size(); i++) if(G[i+u-1] - G[i] == s) res++; printf("%d ",res); } return 0; }
我觉着人家写的代码比较好 参考一下
#include <cstdio> #include <cstring> #include <cmath> #include <vector> #include <algorithm> using namespace std; typedef long long ll; const int sqrt_inf = 46340; const int maxn = 2 * 1e9; int np, pri[sqrt_inf]; bool vis[maxn+5]; vector<int> vec; void prime_table (int n) { np = 0; memset(vis, 0, sizeof(vis)); for (int i = 2; i <= n; i++) { if (vis[i]) continue; pri[np++] = i; for (int j = i * i; j <= n; j += i) vis[j] = 1; } } int solve () { int ret = 0; int a, b, s, k; vec.clear(); memset(vis, 0, sizeof(vis)); scanf("%d%d%d%d", &a, &b, &k, &s); for (int i = 0; i < np && pri[i] * pri[i] <= b; i++) { int u = pri[i], d = (u - a % u) % u; if (u == a + d) d += u; while (d <= b - a) { vis[d] = 1; d += u; } } for (int i = 0; i <= b-a; i++) { if (vis[i] == 0 && a + i > 1) vec.push_back(a+i); } for (int i = 0; i + k - 1 < vec.size(); i++) { if (vec[i+k-1] - vec[i] == s) ret++; } return ret; } int main () { prime_table(sqrt_inf); int cas; scanf("%d", &cas); while (cas--) { printf("%d ", solve()); } return 0; }