筛质数
定理: 如果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;
}
时光花火,水月星辰