模意义下的数和运算
模意义下的数和运算
一共有12个苹果,平分给5个小朋友,最后会剩下几个苹果?
12➗5 = 2......2
第一个2叫商,可以用12/5得到,第二个2叫余数,可以用12%5得到,%叫做模,也就是mod
定义1:模
对于整数a,b,满足b>0,则存在唯一的整数q,r,满足\(a=bq+r\),其中\(0\leq r<b\) 。其中称q为商、r为余数。余数用a mod b或者a%b来表示
1.\((a+b)\% M=(a\% M+b\% M)\% M\)
将a个苹果分给小朋友剩下2个苹果,将b个苹果分给小朋友剩下3个苹果,那么将a+b个苹果分给小朋友剩下的苹果数量,等于把5个苹果分给小朋友剩下的数量
2.\((a-b)\% M=(a\% M-b\% M)\% M\)
即使有\(a\geq b\),但是也不能保证\(a\% M\geq b\% M\),所以这种情况下我们可以优化
\((a-b)\% M=(a\% M-b\% M+M)\% M\)
3.\((a\times b)\% M=(a\% M\times b\% M)\% M\)
除法不成立
所有数mod b只有b种可能,分别是0,1,......,b-1,所以可以把所有整数分为b种类型
如果两个数mod b的结果相同,就分为同一类,叫做同余。
定义2:同余
若两数x,y除以b的余数相等,则称x,y模b同余,记作\(x\equiv y(\mod b)\)
同余的性质:
1.反身性:\(x\equiv x(\mod M)\)
2.对称性:若\(x\equiv y(\mod M)\),则\(y\equiv x(\mod M)\)
3.传递性:若\(x\equiv y(\mod M),y\equiv z(\mod M)\),则\(x\equiv z(\mod M)\)
4.同加性:若\(x\equiv y(\mod M)\),则\(x+z\equiv y+z(\mod M)\)
5.同乘性:若\(x\equiv y(\mod M)\),则\(x\times z\equiv y\times z(\mod M)\)
6.同幂性:若\(x\equiv y(\mod M)\),则\(x^z\equiv y^z(\mod M)\)
7.\(x\equiv y(\mod M)\Longleftrightarrow b|(x-y)\)
定义3:不定方程
不定方程:通常涉及两个或者更多未知数的多项式方程,求解尽在整数范围内进行
在本节中,只需要考虑\(ax+by=c\)的二元一次方程
定理1:裴蜀定理
裴蜀定理:对于整数a,b,设它们的最大公约数\(gcd(a,b)=d\),一定存在一组整数(x,y)使得\(ax+by=d\)
那么如何通过裴蜀定理来解决一般的\(ax+by=c\)的不定方程问题?
定理2:拓展欧几里得算法
对于整数a,b,c,\(ax+by=c\)有整数解,当且仅当\(gcd(a,b)|c\)时成立
所以我们只需要考虑\(ax+by=gcd(a,b)=d\)的一组解就可以了
我们可以使用扩展欧几里得算法(exgcd)
欧几里得算法求出a,b的最大公约数
1.当b=0时,a,b的最大公约数就是a
2.求出b,a mod b的最大公约数,设为g0
3.令g=g0,g就是a,b的最大公约数
仿照这个过程,来求解不定方程
1.当b=0时,\(ax+by=d\)的解为\(x=\frac{d}{a}\),y任意
2.求出\(bx+(a\mod b)y=d\)的一组解,设为\((x_0,y_0)\)
3.令\((x,y)=f((x_0,y_0))\),那么(x,y)就是ax+by=d的一组解。其中f((a,b))指的是将一对数(a,b)做一种变换
那么问题在于如何将(x0,y0)生成一个新的(x,y)
所以只要令\((x,y)=(y_0,x_0-a/b\times y_0)\),就可以解决不定方程问题
求解\(16x+6y=gcd(16,6)=2\)的一组整数解,并求出所有整数解
void exgcd(int a,int b,int &x,int &y){ //求解ax+by=gcd(a,b)
if(b==0){
x=1,y=0;
//此时gcd(a,b)=gcd(a,0)=a,a*1+0*0=a
return ;
}
exgcd(b,a%b,y,x);
//求解bx0+(a%b)y0=gcd(b,a%b)
//执行完这个语句后暂时x=y0,y=x0
y-=a/b*x;
//y=x0-a/b*y0
}
由此求出\(16x+6y=2\)的一组解:\(x=-1,y=3\)
现在已经求出了一组解,那么如何求出所有解呢?
假设这个不定方程还有一组解\((x',y')\),那么就有\(ax'+by'=c\),就可以得到\(a(x'-x)+b(y'-y)=0\)
设\(\Delta x=x'-x,\Delta y=y'-y\),那么一定满足\(a\Delta x+b\Delta y=0\),
同时对于不定方程\(a\Delta x+b\Delta y=0\)的任何一组解\((\Delta x,\Delta y)\),\(a(x+\Delta x)+b(y+\Delta y)=(ax+by)+(a\Delta x+b\Delta y)=c+0=c\)
\((x+\Delta x,y+\Delta y)\)也一定是原不定方程的一组解
所以只需要求出\(a\Delta x+b\Delta y=0\)的所有解,再将这些解加上原来求出的特解,就可以得到原不定方程的所有解
首先求出\(ax+by=0\)的最小一组非零解\((x_{min},y_{min})\)(指绝对值最小),考虑\(ax+by=0\),则\(|ax|=|by|\),那么\(|ax|\)或者说\(|by|\),一定同时是a,b的倍数,想让|x|尽量小,也就是让a,b的公倍数尽量小,最小就是a,b的最小公倍数\(lcm(a,b)=a\times b/gcd(a,b)\)。
所以最小的一组非零解就是\((x_{min},y_{min}=(\frac{b}{gcd(a,b)}),\frac{-a}{gcd(a,b)})\)
于是我们就可以求出形如\(ax+by=c\)的方程的所有解了。对于本样例不定方程来说,\(ax+by=0\)的最小的一组非零解是\(x'=3,y'=-8\)。所以\(16x+6y=2\)的所有解就是\(x=-1+3k,y=3-8k\)
如果想要求出\(16x+6y=6\)的解呢?因为6是2的3倍,所以求出来的特解就是\(16x+6y=2\)求出的特解的3倍,也就是\(x=-3,y=9\),同时\(16x+6y=0\)的解是不变的,所以最后的解为\(x=-3+3k,y=9-8k\)
青蛙的约会
以纬度线东经0度为起点,由东向西为正方向,总长为L米,青蛙A的起始点为x,一次能向正方向跳m米,青蛙B的起始点为y,一次能向正方向跳n米,跳一次花费时间相同,问跳几次会相遇
//求最小值的板子
#include <bits/stdc++.h>
using namespace std;
long long x,y,m,n,L,d,k,z;
int f=1;
long long exgcd(long long a,long long b,long long &x,long long &y){ //ax+by=gcd(a,b)
if(b==0){
x=1,y=0;
return a;
}
long long d=exgcd(b,a%b,y,x);
y-=a/b*x;
return d;
}
int main()
{
cin>>x>>y>>m>>n>>L;
if(m<n){ //处理m-n为负数的情况
swap(n,m);
f=-1;
}
d=exgcd(m-n,L,k,z); //k(m-n)+zL=y-x
if((y-x)%d!=0){ //判断是否无解
cout<<"Impossible"<<endl;
return 0;
}
k=k*f*(y-x)/d; //求解k*(m-n)+zL=y-x
k=(k%(L/d)+(L/d))%(L/d); //求出最小的正数x
cout<<k<<endl;
return 0;
}