HDU5901 Count primes素数

Posted 海岛Blog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU5901 Count primes素数相关的知识,希望对你有一定的参考价值。

Count primes
Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 3365 Accepted Submission(s): 1706

Problem Description
Easy question! Calculate how many primes between [1…n]!

Input
Each line contain one integer n(1 <= n <= 1e11).Process to end of file.

Output
For each case, output the number of primes in interval [1…n]

Sample Input
2
3
10

Sample Output
1
2
4

Source
2016 ACM/ICPC Asia Regional Shenyang Online

问题链接HDU5901 Count primes
问题简述:计算区间[1,1e11]素数的个数。
问题分析:素数有关问题,不解释。
程序说明:(略)
参考链接:(略)
题记:(略)

AC的C++语言程序如下:

/* HDU5901 Count primes */

#include <bits/stdc++.h>

using namespace std;

typedef long long LL;
const int N = 320000;   // 316227 = sqrt(1e11)
LL n, f[N], g[N];

void init()
{
    LL m;
    for (m = 1; m * m <= n; m++) f[m] = n / m - 1;
    for(LL i = 1; i <= m; i++) g[i] = i - 1;
    for(LL i = 2; i <= m; i++) {
        if(g[i] != g[i-1]){
            for(LL j = 1; j <= min(m - 1, n / i /i); j++) {
                if (i * j < m) f[j] -= f[i * j] - g[i - 1];
                else f[j] -= g[n / i / j] - g[i - 1];
            }
            for(LL j = m; j >= i * i; j--)
                g[j] -= g[j / i] - g[i - 1];
        }
    }
}

int main()
{
    while (~scanf("%lld", &n)) {
        init();
        printf("%lld\\n", f[1]);
    }

    return 0;
}

以上是关于HDU5901 Count primes素数的主要内容,如果未能解决你的问题,请参考以下文章

[素数个数模板] HDU 5901 Count primes

HDU 5901 Count primes (1e11内的素数个数) -2016 ICPC沈阳赛区网络赛

HDU 5901 Count primes (模板题)

hdu 5901 Count primes

Hdu 5901 Count primes

hdu 5901 Count primes (2016沈阳网络赛)