題意:給乙個質數\(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\)之間的距離不會超過300,判定乙個\(10^\)級別的素數可以先用尤拉篩對\(10^\)之內的素數打表(總共約\(6\times10^\)個素數),這樣每次可以用o(\(6\times10^\))的時間判斷這個數是不是素數。(感謝董隊的__int128板子tut)
**:
#include using namespace std;
typedef __int128 ll;
const int maxn = 1e7 + 5;
int prime[maxn];
int visit[maxn];
inline __int128 read()
while(ch>='0'&&ch<='9')
return x*f;
}inline void print(__int128 x)
if(x>9)
print(x/10);
putchar(x%10+'0');
}void prime()
for (int j = 1; j <=prime[0] && i*prime[j] <= maxn; j++) }}
}int p[maxn], cnt;
ll qpow(ll x, ll y, ll mod)
return res;
}bool isprime(ll x)
return true;
}int main()
ans = (ans * qpow(i, n - 2, n)) % n;
i--;
} print(ans);
printf("\n");
}}
威爾遜定理
而要解這個問題,使用窮舉或暴搜的方法顯然不可取。若要優雅而巧妙地解決這個問題,就需要用到乙個關於素數的著名結論 威爾遜定理 wilson s theorem 十八世紀中葉,一位英國法官約翰 威爾遜爵士,發現了數論中一種極為罕見的關係 取從1到某個質數所有連續正整數的乘積,例如從1乘到11,即11的階...
Fansblog(威爾遜定理 大數階乘取模)
原題 題意 給出乙個質數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質數分布密度 素數分布越來越...
威爾遜定理 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對於每個測試樣例,輸出...