HDU 2973 YAPTCHA

http://acm.hdu.edu.cn/showproblem.php?pid=2973

威尔逊定理,详情参见数论四大定理。从这道题应用的层面讲,我们只需要知道若p为素数,则p可整除(p-1)!+1。

有上面的结论这道题就解决了,3k+7为素数则答案加1,为非素数则不变。(代数式简单变化一下很容易看出来,此处不赘述)

为了防止超时,提前把答案打表打出来就好。

输入输出挂,果断刷到第一。

View Code
#include <iostream>

using namespace std ;

bool prime[3000008] ;

int ans[1000001] ;

inline bool scan_d(int &num) 

{

        char in;bool IsN=false;

        in=getchar();

        if(in==EOF) return false;

        while(in!='-'&&(in<'0'||in>'9')) in=getchar();

        if(in=='-'){ IsN=true;num=0;}

        else num=in-'0';

        while(in=getchar(),in>='0'&&in<='9'){

                num*=10,num+=in-'0';

        }

        if(IsN) num=-num;

        return true;

}

void print_f(int x){

    if(x==0)return;

    print_f(x/10);

    putchar(x%10+'0');

}

int main() 

{

    prime[0]=prime[1]=true ;

    for(int i=2;i<=1732;i++)

        if(!prime[i])

            for(int j=i;j*i<=3000007;j++)

                prime[j*i]=true ;

    for(int i=1;i<=1000000;i++)

        if(!prime[3*i+7])

            ans[i]=ans[i-1]+1 ;

        else

            ans[i]=ans[i-1] ;

    int t ;

    scan_d(t) ;

    while(t--)

    {

        int n ;

        scan_d(n) ;

        if(n==1)

            putchar('0') ;

        else

            print_f(ans[n]) ;

        putchar('\n') ;

    }

    return 0 ;

}

 

 

 

你可能感兴趣的:(HDU)