威尔逊原理。即对于素数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; }