素数个数
【题目描述】求n到n+m内的素数个数
【解题报告】
“数论题目有时复杂度看着很大,实际上并没有那么大”
详见代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e6 + 3;
ll n, m, pr[N], tot, s[N];
bool vis[N];
int main() {
int T;
scanf("%d", &T);
while (T--) {
scanf("%lld%lld", &n, &m);
memset(vis, 0, sizeof vis);
tot = m + 1;
for (ll i = 2; i <= 1e6 && i <= n + m; i++)
for (ll j = (n / i) * i; j <= n + m; j += i) //保证跳到的都是合数
if (j >= n && j != i && !vis[j - n]) {
vis[j - n] = 1;
tot--; //素数的个数等于总数-合数
}
printf("%lld\n", tot);
}
return 0;
}