一本通提高篇之同余问题(课堂笔记)
上课记的,有点乱
「一本通 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;
}
本文来自博客园,作者:zhangtingxi,转载请注明原文链接:https://www.cnblogs.com/zhangtingxi/p/15816368.html