1. 程式人生 > >hdu2973 YAPTCHA【威爾遜定理】

hdu2973 YAPTCHA【威爾遜定理】

素數 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【威爾遜定理】