筛质数

定理: 如果n不是素数, 则n有满足1<d<=sqrt(n)的一个"素数"因子d.(若没有素因子,则n是素数)
证明:如果n不是素数,则n有满足1<d<=sqrt(n)的一个因子d,如果d是素数,则定理得证,算法终止。否则令n=d,由于不可能无限分解n的因子,因此上述算法最终会终止。

点击查看代码
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
const int maxn = 1e6 + 2;
const int mod = 1e9 + 7;
const ll INF = 1e18;

#define int long long
ll r, v[maxn], prime[maxn], tot, l, n, p[maxn];
bool not_prime[maxn];

inline ll read()
{
    ll x = 0, f = 1;
    char ch = getchar();
    while(ch < '0' || ch > '9')
    {
        if(ch == '-')
        {
            f = -1;
        }
        ch = getchar();
    }
    while(ch >= '0' && ch <= '9')
    {
        x = (x << 1) + (x << 3) + (ch^48);
        ch = getchar();
    }
    return x * f;
}

void primes()
{
    n = sqrt(r);
    for(int i=2; i<=n; i++)
    {
        if(!not_prime[i])
        {
            prime[++tot] = i; v[i] = i;
        }
        for(int j=1; j<=tot&&i*prime[j]<=n; j++)
        {
            not_prime[i*prime[j]] = 1;
            v[i*prime[j]] = prime[j];
            if(i % prime[j] == 0) break;
        }
    }
}

signed main()
{
    l = read(); r = read();
    primes();
    for(ll j=1; j<=tot; j++)
    {
        for(ll i=l/prime[j]; i<=r/prime[j]; i++)
        {
            while(i<=1) i++;
            if(prime[j]*i<l || prime[j]*i>r) continue;
            if(p[prime[j]*i-l]) continue;
            p[prime[j]*i-l] = prime[j];
        }
    }
    for(int i=0; i<=r-l; i++)
    {
        if(p[i]) printf("%lld\n", p[i]);
        else printf("%lld\n", i+l);
    }

    return 0;
}
posted @ 2022-08-10 15:43  Catherine_leah  阅读(16)  评论(0编辑  收藏  举报
/* */