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

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;
}

 

你可能感兴趣的:(YAPTCHA(HDU2973)[威尔逊定理])