- VisualStudio2022插件的安装及使用-编程手把手系列文章
- pprof-在现网场景怎么用
- C#实现的下拉多选框,下拉多选树,多级节点
- 【学习笔记】基础数据结构:猫树
对于任意一组整数 \(a,b\),存在一组整数 \(x,y\),满足 \(ax+by=\gcd(a,b)\).
考虑数学归纳法.
当 \(b=0\) 时,由于 \(\gcd(a,0)=a\),则对于 \(ax+0y=a\) 这个不定方程,\(x=1\),\(y\) 取任意整数.
假设存在一组整数 \(x,y\),满足 $bx+(a\bmod b)y=\gcd(b,a\bmod b)=\gcd(a,b) $.
那么接下来证明也存在一组整数 \(x',y'\) 满足 \(ax'+by'=\gcd(a,b)\).
当 \(x'=y,y'=x-\lfloor\dfrac{a}{b}\rfloor y\) 时满足条件.
那么利用辗转相除法进行递归,总能递归到 \(b=0\) 的情况。命题得证.
求关于 \(x,y\) 的方程 \(ax+by=c\) 的整数解.
设 \(d=\gcd(a,b)\),方程有整数解的充要条件是 \(d\mid c\).
Proof:
设 \(a=k_1d,b=k_2d\),则有 \(k_1dx+k_2dy=c \Rightarrow k_1x+k_2y=\dfrac{c}{d}\).
先证必要性: 由于 \(\dfrac{c}{d}\) 必须为整数,则 \(d \mid c\).
再证充分性:上式中,\(k_1\perp k_2\),则方程 \(k_1x'+k_2y'=1\) 一定有整数解。由于 \(\dfrac{c}{d} \in\mathbb{Z}\),那么原方程也一定有整数解.
先将方程化简,两边同除以 \(d\)。此时 \(a,b\) 互质.
注意,为了方便表述,下面提到的方程都是化简后的方程.
那么我们可以先利用裴蜀定理求出 \(ax'+by'=1\) 的一组特解 \(x',y'\),从而求出原方程的一组特解 \(x_0=cx’,y_0=cy'\).
考虑如何求出通解.
让 \(x\) 加上一个数,那么 \(y\) 就要减去一个数。设这两个数为 \(\Delta_x,\Delta_y\),则有:
由于 \(a,b\) 互质,则 \(\dfrac{a}{b}\) 为最简整数比,则有 \(a \mid \Delta_y\) 且 \(\ b\mid \Delta_x\).
由于 \(\Delta_x,\Delta_y \in \mathbb{Z}\),则 \(\Delta_x\) 最小取到 \(b\),\(\Delta_y\) 最小取到 \(a\).
通解即为:
代回原方程,可以消掉 \(kb,ka\).
接下来考虑,当存在正整数解时,如何求出最小正整数解与正整数解的个数.
对 \(x\) 的通解进行变形,求 \(x\) 的最小正整数解 \(x_1\):
先减一是为了避免 $x_0 \bmod a $ 一开始就为 \(0\) 的情况,从而保证 \(x_1>0\).
易得,当 \(x\) 增大时,\(y\) 减小。当 \(x\) 取 \(x_1\) 时,\(y\) 取到最大正整数解 \(y_2\).
同理,求出 \(y\) 的最小正整数解 \(y_1\),当 \(y\) 取 \(y_1\) 时,\(x\) 取到最大正整数解 \(x_2\).
由通解公式可得,\(x\) 每两个整数解之间相差 \(b\),\(y\) 每两个整数解之间相差 \(a\).
正整数解的个数即为 \(\dfrac{x_2-x_1}{b}+1\) 或 \(\dfrac{y_2-y_1}{a}+1\).
根据上面的分析,套用公式即可.
ll T,A,B,C,x,y,d,x1,x2,y1,y2,cnt;
ll GetX(ll Y){return (C-B*Y)/A;}
ll GetY(ll X){return (C-A*X)/B;}
ll Exgcd(ll a,ll b,ll &x,ll &y){
if(b==0) return x=1,y=0,a;
ll res=Exgcd(b,a%b,x,y);
ll z=x;
x=y;
y=z-(a/b)*y;
return res;
}
void Solve(){
read(A),read(B),read(C);
d=Exgcd(A,B,x,y);
if(C%d) return puts("-1"),void();
A/=d,B/=d,C/=d;
x*=C,y*=C;
x1=((x-1)%B+B)%B+1;
y2=GetY(x1);
y1=((y-1)%A+A)%A+1;
x2=GetX(y1);
cnt=(x2-x1)/B+1;
if(y2<=0) printf("%lld %lld\n",x1,y1);
else printf("%lld %lld %lld %lld %lld\n",cnt,x1,y1,x2,y2);
}
对式子进行变形:
利用 Exgcd 求解即可.
这是非常常用的变形技巧,也是当 \(a,b\) 互质但 \(b\) 不是质数时求逆元的方法.
设跳跃 \(k\) 次后两青蛙相遇,则可列出方程:
其中 \(S,L,C\) 为常数.
把 \(k,p\) 看作未知数,利用 Exgcd 求 \(k\) 的最小正整数解即可.
最后此篇关于二元一次不定方程(Exgcd)(更方便的解法)的文章就讲到这里了,如果你想了解更多关于二元一次不定方程(Exgcd)(更方便的解法)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
我有几个关于描述算法时使用的术语语义的问题。 首先,“朴素”算法是什么意思?这与给定问题的其他解决方案有何不同?解决方案还可以采用哪些其他形式? 其次,我听说过很多关于“封闭式”解决方案的说法。我也不
我是从 k&r 学习 C 作为第一语言,我只是想问一下,如果你认为这个练习的解决方式是正确的,我知道它可能没有你想要的那么完整,但我想要 View ,所以我知道我正在正确地学习 C。 谢谢 /* Ex
我是一名优秀的程序员,十分优秀!