原題:
題意:
給出乙個質數p
pp,找出小於p
pp的最大的質數n
nn,求出n
nn的階乘模p
pp。(p∈[
1e10,
1e14]
p\in[1e10,1e14]
p∈[1e1
0,1e
14])
解析:
有兩個定理:
威爾遜定理:當p
pp為質數的時候,(p−
2)!=
1(p-2)!=1
(p−2)!
=1質數分布密度:素數分布越來越稀疏,但1e18內任意兩個質數的差不會很大,好像有個人證明了不會超過246。
參考**:所以,我們用大素數檢測p−1
p-1p−
1以下的數,找到那個質數n
nn。然後答案就是∏i=
n+1p
−2in
v(i)
\prod_^inv(i)
∏i=n+1
p−2
inv(
i)。**:
#include
using
namespace std;
typedef
long
long ll;
ll modmul
(ll a,ll b,ll n)
//快速積取模 a*b%n
return ans;
}ll modexp
(ll a,ll b,ll n)
//快速冪取模 a^b%n
return ans;
}bool
miller_rabin
(ll n)
//miller-rabin素數檢測演算法
if(x!=1)
return
false;}
return
true;}
ll inv
(ll a,ll mod)
intmain()
ll ans=1;
for(k++
;k<=n-
2;k++
)printf
("%lld\n"
,ans);}
return0;
}
Fansblog 威爾遜定理
題意 給乙個質數 p 找小於 p 的最大質數 q 並求 q modp p,q epsilon 10 9,10 題解 威爾遜定理 乙個數 n 若是質數,則有 n 1 equiv n 1 mod n 於是可以先令 ans p 1 再對 p 1 到 q 的數對 p 求逆元。p 到 q 之間的距離不會超過3...
威爾遜定理
而要解這個問題,使用窮舉或暴搜的方法顯然不可取。若要優雅而巧妙地解決這個問題,就需要用到乙個關於素數的著名結論 威爾遜定理 wilson s theorem 十八世紀中葉,一位英國法官約翰 威爾遜爵士,發現了數論中一種極為罕見的關係 取從1到某個質數所有連續正整數的乘積,例如從1乘到11,即11的階...
威爾遜定理 k p
傳送門 給你乙個素數p,讓你求 k p,其中k為比p小的整數裡最大的素數。例如p 5,則k 3。p 11,則k 7。k k k 1 2 1 input第一行包含乙個整數 t 1 t 10 表示測試樣例的個數.接下來有t行,每行包含乙個素數 p 1e9 p 1e14 output對於每個測試樣例,輸出...