-5 mod 3 = -2 :这是因为在a,p异号的时候,c++遵循使商尽可能大的原则,选取了-1作为商。所以我们平时计算减法时,为防止要取mod的数字为负数,多加上一个p:
(a - b ) % p = ( ( a % p ) - ( b % p ) + p ) % p;
[](()同余
a%b==c%b 可以说a≡c(mod b);a,c对mod b同余
第二定义:若 m | ( a-b ),a,b对mod m同余
性质:
(1)若a≡b(mod m),则(a,m)=(b,m) [欧几里得算法]
(2)若a≡b(mod m),则_ak_≡bk(mod m)
(3)若a≡b(mod m),且a=a|d,b=b|d, (d,m)=1,则ad≡bd(mod m);
[](()同余式
若用f(x)表示系数为整数的多项式,又设m是一个正整数,则f(x)≡0(mod m)叫做模m的同余式。
//ax+by=gcd(a,b)
一次同余式:ax≡b(mod m) 使同余式成立的_x_叫做该式的一个解
ax≡b(mod m) 与ax+my=b等价
定理1:一次同余式(又叫线性同余方程)有解的充要条件是 (a,m)|b。
证:
一次同余式可写成:ax=my+b => ax-my=b
因y无关紧要,令y=-y,得ax+my=b => (a,m)|b [裴蜀定理];
证毕;
定理2:若gcd(a,b)=1 ,且 x0、y0 为方程 ax+by=c 的一组解,则该方程的任意解可表示为:x=x0+bt,y=y0-at, 且对任意整数 t 都成立。
根据定理 2,可以求出方程的所有解。但在实际问题中,我们往往被要求求出一个最小整数解,也就是一个特解x=(x mod t + t ) mod t ,其中 t=( b / gcd(a,b))。
[](()逆元(Day 1 )
方程ax≡1(mod m)的一个解x,称为x为a模m的逆。
//(a,m)=1;
设k是b的逆元 <=> bk mod m = 1;
逆元的求法:
(1)拓展欧几里得解方程
exgcd是求解不定方程ax+by=c的解,由逆元定义,a*inv(a)≡1(mod m)
即a* inv(a)+m*y=1的方程的解,由于a,m已知,根据exgcd可求出inv(a)
只有gcd(a,m)=1时,才有逆元
int exgcd(int a,int b,int &x,int &y){
if(b==0) {
x=1;
y=0;
return a;
}
int d=exgcd(b,a%b,x,y);
int temp=x;
x=y;
y=temp-a/b*y;
return d;
}
int getinv(int a,int mod){//a在mod下的逆元
int x,y;
int d=exgcd(a,mod,x,y);
return d==1?(x%mod+mod)%mod:-1;
}
(2)费马小定理:p是素数,gcd(a,p)=1
int quickpow(int a,int p,int mod){//快速幂</