取模:
a%b b定是正整数,尽管语言上b<0合法。/b=0出现除0错
(a+b)mod n=((a mod n)+(b mod n)) mod n
(a-b)mod n=((a mod n)-(b mod n)+n)mod n //注意减法, a mod n 可能小于 b mod n 结果需加上n
ab mod n=(a mod n)(b mod n)mod n
注意乘法,注意(a mod n)(b mod n)是否会溢出,用long long 保存中间结果
1 int mul_mod(int a,,int b,int n) 2 { 3 a%=n;b%=n; 4 return (int)((long long)a*b%n); 5 }
除法不可直接取模,用到乘法逆元
同余运算:
若(a-b)%m==0,就称a,b关于m同余/a,b对模数m同余
e.g. (100-60)%8==0,我们就说100和60对于模数8同余
它的另一层含义就是说,100和60除以8的余数相同。
a和b对m同余,我们记作a≡b(mod m)
你会发现这种记号到处都在用,比如和数论相关的书中就经常把a mod 3 = 1写作a≡1(mod 3)
性质:
如果a≡b(mod m),x≡y(mod m),则a+x≡b+y(mod m)//两边分别相加也是
如果a≡b(mod m),x≡y(mod m),则ax≡by(mod m)//两边分别相乘也是
如果ac≡bc(mod m),且c和m互质,则a≡b(mod m)//c,m互质时,去掉c也是
模线性方程组:
输入正整数a,b,n 解方程ax≡b(mod n).a,b,n<=10^9
方程可理解为ax-b是n的正整数倍,设倍数为y,则ax-b=ny;即ax-ny=b 解此不定方程----扩展欧几里得算法
同余方程的解是一个同余等价类
b=1时,ax≡1(mod n)的解称a关于模n的逆invers----乘法逆元
有解条件,a,n互质gcd(a,n)=1,此时,方程只有唯一解