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