数论题目小记

素数个数

【题目描述】求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;
}

猜你喜欢

转载自www.cnblogs.com/phemiku/p/11802954.html