离线打表啊,曾经1A的题,竟然到底没做出来。。。
prime[i]*prime[j]可能会有重复结果,简单统计小于n的肯定不行
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#include <map>
#include <string>
#include <cmath>
#define maxn 1100000
#define LL long long
using namespace std;
bool pri[maxn];
int prime[maxn/10];
int ans[maxn];
int main()
{
memset(pri,false,sizeof(pri));
int t=0;
for(int i=5;i<maxn;i+=4)
{
if(!pri[i])
{
prime[t++]=i;
for(int j=i+i;j<maxn;j+=i)
{
pri[j]=true;
}
}
}
memset(ans,0,sizeof(ans));
for(int i=0;prime[i]*prime[i]<=maxn;++i)
{
for(int j=i;(LL)prime[i]*prime[j]<=maxn;++j)
{
ans[prime[i]*prime[j]]=1;
}
}
for(int i=1;i<maxn;++i)
{
ans[i]+=ans[i-1];
}
int n;
while(scanf("%d",&n),n!=0)
{
printf("%d %d\n",n,ans[n]);
}
}