一本通提高篇之同余问题(课堂笔记)

上课记的,有点乱

「一本通 6.4 例 1」青蛙的约会

式子推倒

\[\Large x+mt\equiv y+nt\pmod L \]

\[\Large mt-nt\equiv y-x \pmod L \]

\[\Large (m-n)t\equiv y-x \pmod L \]

\[\Large t\equiv (y-x)\times (m-n)^{-1} \pmod L \]

逆元:若 \(x\times x^{-1}\equiv \pmod L\),则称 \(x^{-1}\)\(x\) 的逆元。

假设 \((m-n)=k\),现在求 \(k^{-1}\)

拓展欧几里得

假设有 \(ax+by=1\)

\(\gcd(a,b)=1\),则有解,不然可以提一个 \(gcd(a,b)\) 出来。

\(r=a\bmod b\)

\[\Large bx'+ry'=1 \]

这样子不断模下去,必然会出现 \(r=0, b=1\),此时 \(x=y=1\) 即可。

现在我们假设知道:

\[\Large ax+by=1 \]

\[\Large bx'+ry'=1 \]

\(p=\frac{a}{b}\)\(r=a%b\)\(a=pb+r\)

带入得:

\[\Large (pb+r)x+by=1 \]

\[\Large pbx+rx+by=1 \]

\[\Large b(px+y)+rx=1 \]

此时我们发现这条式子与 \(bx'+ry'=1\) 很像,于是得到:

\[\Large x=y' \]

\[\Large y=x'-px \]

拓欧求逆元

\[ax\bmod b+by\bmod b=1 \]

\[ax\bmod b=1 \]

所以 \(x\)\(a\bmod b\) 下的逆元。

code

void exgcd(int a, int b, int x, int y)
{
	if(b==0) x=y=1; 
	else
	{
		gcd(b, a%b, y, x); 
		y-=a/b*x; 
	}
}

int main()
{
	a=((m-n)%L+L)%L; //求a的逆元
	exgcd(a, L, x, y); 
}

题目解法

\(ax+by=c\)有解,\(ax+by\) 总是 \(\gcd(a,b)\) 的倍数,所以 \(c\) 也要是 \(\gcd(a,b)\) 的倍数。

#include<bits/stdc++.h>
using namespace std; 
#define int long long
int n, m, i, j, k; 
int x, y, p, q, L, a, b, c; 

void exgcd(int a, int b, int &x, int &y)
{
	if(b==0) x=c/a, y=0; 
	else
	{
		exgcd(b, a%b, y, x); 
		y-=a/b*x; 
	}
}//exgcd直接解方程

signed main()
{
	cin>>x>>y>>m>>n>>L;  
	a=((m-n)%L+L)%L;
	c=((y-x)%L+L)%L; 
	exgcd(a, L, p, q); 
	p=(p%L+L)%L; 
	if(a*p%L!=c) return printf("Impossible"), 0; 
	printf("%lld", p); 
	return 0; 
}
posted @ 2022-01-18 09:26  zhangtingxi  阅读(33)  评论(0编辑  收藏  举报