虽然知道是个大水题,但最近在尝试用Windows Live Writer 写cppblog,还没有学会折叠代码的正确姿势,所以就把代码贴在这边吧。
题意很简单,由威尔逊定理,就是对一个01序列进行求和……
#include <cstdio>
#include <cstring>
const int N=3000010;
int num[1000005];
bool tag[N];
void Init ()
{
for (int i=2;i<N;i++) if (tag[i]==false) //筛素+判断
{
if (i>7 && (i-7)%3==0) //k从1开始,所以要求大于7
num[(i-7)/3]++;
for (int j=i+i;j<N;j+=i)
tag[j]=true;
}
for (int k=1;k<1000005;k++)
num[k]+=num[k-1];
}
int main ()
{
Init ();
int T,n;
scanf("%d",&T);
while (T--)
{
scanf("%d",&n);
printf("%d\n",num[n]);
}
return 0;
}