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