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