LightOJ1197 Help Hanzo sieve interval

LightOJ1197 Help Hanzo

label

  • Interval sieve method

Foreword

Concise meaning of the questions

  • The number of prime demand interval (interval length <= 1e6)

Thinking

  • Interval [l, r] the sum, there must be a prime factors <= sqrt (r). Accordingly advance sieved [1, sqrt (r)] in the primes and multiple primes enumerated it.

Precautions

  • Note that the pointer moves in the interval should be set to a long long
  • Special judge about the case l = 1

to sum up

  • no

AC Code

#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;

const int maxn = 1e5 + 10;

int mod;

bool no_prime[maxn];
int prime[maxn];
int shai(int n)
{
    int cnt = 0;
    no_prime[1] = 1;

    for (int i = 2; i <= n; i++)
    {
        if (!no_prime[i])
            prime[++cnt] = i;

        for (int j = 1; j <= cnt && prime[j] * i <= n; j++)
        {
            no_prime[prime[j] * i] = 1;
            if (i % prime[j] == 0) break;
        }
    }
    return cnt;
}

bool no_prime1[(int)1e6 + 10];
int cal(int l, int r)
{
    memset(no_prime1, 0, sizeof no_prime1);
    int cnt = 0;
    for (int i = 1; prime[i] <= sqrt(r); i++)
    {
        for (long long j = max(l % prime[i] == 0 ? l : (l / prime[i] + 1) * prime[i], 2 * prime[i]); j <= r; j += prime[i])
            if (no_prime1[j - l] == 0)
                no_prime1[j - l] = 1, cnt++;
    }
    return r - l + 1 - cnt + (l == 1 ? -1 : 0);
}

void solve()
{
    shai(maxn - 10);

    int t;
    scanf("%d", &t);
    for (int i = 1; i <= t; i++)
    {
        int l, r;
        scanf("%d%d", &l, &r);

        printf("Case %d: %d\n", i, cal(l, r));
    }
}

int main()
{
    freopen("Testin.txt", "r", stdin);
    solve();
    return 0;
}

Guess you like

Origin www.cnblogs.com/danzh/p/11429219.html