YAPTCHA(HDU2973)【威尔逊定理】

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

 

posted @ 2019-09-25 01:31  xxmlala  阅读(159)  评论(0编辑  收藏  举报