【總結】noip數學彙總
阿新 • • 發佈:2019-02-13
noip臨近,有點怕需要數學知識定理才能做的題
快速冪
用途
時間內求解
證明&過程
由於,而且每個自然數都可以拆分為不超過個二次冪的和,即
則
其中為,可以遞推求得
程式碼
int qpow (int A,int B){
int res(1);while(B){
if(B&1)res=1ll*res*A%p;
A=1ll*A*A%p,B>>=1;
}return res;
}
一些定理
- 威爾遜定理:對於任意質數,有
- 費馬小定理:對於任意質數,有
擴充套件歐幾里得
用途
求解形似 方程的解
證明&過程
由於,則有
遞迴求解即可
程式碼
void exgcd(int a,int b,int&x,int&y){
if(!b){x=1,y=0;return ;}
exgcd(b,a%b,x,y);
int tmp=x;x=y;y=tmp-a/b*y;
}
線性求逆元
用途
在時間內求解區間中所有數的逆元
證明&過程
求 關於 的逆元
一般的對於 ,有
對於 的情況,設
放在模意義下,
同乘,得
由上面的定義式,有
則有
後面的可以通過呼叫前面的陣列得到,前面的部分相當於轉移係數
程式碼
inv[1]=1;
for(int i=2;i<=n;++i)
inv[i]=1ll*(p-p/i)*inv[p%i]%p;
中國剩餘定理
用途
求解同餘方程組
證明&過程
將式子拆開為多個形似下面的式子
則對於每個方程化為方程:,最後再乘上
擴歐求解,解出第 個方程的解為 ,則將答案合併得
程式碼
void CRT(){
read(n);
int lcm=1;
for(int i=1;i<=n;++i){
read(a[i]),read(p[i]);
a[i]%=p[i];lcm*=p[i];
}
int x,y,ans=0;
for(int i=1;i<=n;++i){
int kl=lcm/p[i],t;
exgcd(kl,p[i],x,y);
t=1ll*x*kl*a[i]%p;
ans=(ans+t)%lcm;
}
printf("%d\n",ans);
}