hdu2973 YAPTCHA【威爾遜定理】
阿新 • • 發佈:2018-08-01
素數 net gre div set bae 技術分享 turn target
<題目鏈接>
題目大意:
The task that is presented to anyone visiting the start page of the math department is as follows: given a natural n, compute
where [x] denotes the largest integer not greater than x.
給出 t 和n,t代表樣例組數,根據給出的n算出上面表達式。(註意:[x]表示,不超過x的最大整數)
解題分析:
首先,看到這種階乘的形式,就很容易聯想到威爾遜定理,這裏的3*k+7就相當於定理中的p。威爾遜定理告訴我們:當且僅當p為素數時:( p -1 )! ≡ -1 ( mod p )。
所以,當p為素數時,(p-1)!+1 ≡ 0 (modp)。於是,不難看出,當3*k+7為素數時,An=1,不為素數時,An=0,,所以用前綴和記錄一下1~n有多少個素數即可。
#include <cstdio> #include <cstring> const int maxn=1e6+100; int juge(int x) { x=3*x+7; for(int i=2;i*i<=x;i++) if(x%i==0)return false; return true; } int sum[maxn]; int main() { memset(sum,0,sizeof(sum)); sum[1]=0; for(int i=2;i<=maxn;i++) { if(juge(i))sum[i]=sum[i-1]+1; else sum[i]=sum[i-1]; } int t;scanf("%d",&t); while(t--) { int n; scanf("%d",&n); printf("%d\n",sum[n]); } return 0; }
2018-07-31
hdu2973 YAPTCHA【威爾遜定理】