问题 C: #6235. 区间素数个数
时间限制: 2 Sec 内存限制: 512 MB提交: 25 解决: 4
[ 提交][ 状态][ 讨论版][命题人: 外部导入]
题目描述
求 1∼n 1\sim n 1∼n 之间素数个数。
输入格式
一行一个数 n n n 。
输出格式
一行一个数,表示答案。
样例
样例输入
10
样例输出
4
样例解释 1
2,3,5,72,3,5,72,3,5,7
数据范围与提示
对于 100% 100\% 100% 的数据,2≤n≤1011 2 \leq n \leq 10^{11} 2≤n≤1011。
#include <iostream>
using namespace std;
typedef long long ll;
ll f[340000], g[340000], n;
void init()
{
ll i, j, m;
for(m = 1; m*m <= n; m++)
f[m]=n/m-1;
for(i = 1; i <= m; i++)
g[i] = i-1;
for(i = 2; i <= m; i++)
{
if(g[i] == g[i-1])
continue;
for(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(j = m; j >= i*i; j--)
g[j] -= g[j/i]-g[i-1];
}
}
int main(void)
{
while(~scanf("%lld",&n))
{
init();
cout<<f[1]<<endl;
}
return 0;
}