威尔逊原理。即对于素数p,有(p-1)!=-1( mod p).
首先,将原式变形为[ (3×k+6)! % (3×k+7) + 1] / (3×k+7),所以:
1.3×k+7是素数,结果为1,
2.3×k+7不是素数,则假设(3×k+7)=m1*m2*m3……,可知m1,m2,m3……<=3*k+6,则此时(3×k+6)! % (3×k+7) = 0,所以经过取整,式子的答案为0.
#include<cstdio>
using namespace std;
int is_prime[3000010],sum[1000010];
void init(){
for(int i=0;i<=3000010;i++)
is_prime[i]=true;
is_prime[0]=is_prime[1]=false;
for(int i=2;i<=3000010;i++){
if(is_prime[i]){
for(int j=2*i;j<=3000010;j+=i)
is_prime[j]=false;
}
}
for(int i=1;i<=1000000;i++)
sum[i]=sum[i-1]+is_prime[3*i+7];
}
int main(){
int t,n;
init();
scanf("%d",&t);
while(t--){
scanf("%d",&n);
printf("%d\n",sum[n]);
}
return 0;
}