Prime k-tuple UVA

 就是大区间求素数  参考

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;
}
自己选择的路,跪着也要走完。朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。
原文地址:https://www.cnblogs.com/WTSRUVF/p/9330449.html