Unverified Commit 32d5ff9c authored by 心旷神怡's avatar 心旷神怡 Committed by GitHub
Browse files

格式大幅调整;主观推定了原作者的符号含义

RT
parent 5da645ff
Loading
Loading
Loading
Loading
+33 −36
Original line number Diff line number Diff line
@@ -4,72 +4,69 @@

其内容是: 

设 $a,b$ 是不全为零的整数则存在整数 $x,y$使得 $ax+by=\gcd(a,b)$
设 $a,b$ 是不全为零的整数, 则存在整数 $x,y$, 使得 $ax+by=\gcd(a,b)$.

## 证明

1.若任何一个等于$0$,$\gcd(a,b)=a$.这时定理显然成立
1. 若任何一个等于 $0$,$\gcd(a,b)=a$. 这时定理显然成立.

2.$a,b$不等于.
2.$a,b$ 不等于 $0$.

由于 $\gcd(a,b)=\gcd(a,-b)$
    由于 $\gcd(a,b)=\gcd(a,-b)$,

不妨设 $a,b$ 都大于零,$a>=b,\gcd(a,b)=d$
    不妨设 $a,b$ 都大于 $0$, $a\geq b,\gcd(a,b)=d$.

对 $ax+by=d$两边同时除以$d$可得 $(a1)x+(b1)y=1$其中 $(a1,b1)=1$
    对 $ax+by=d$, 两边同时除以$d$, 可得 $a_1x+b_1y=1$, 其中 $(a_1,b_1)=1$.

转证 $(a1)x+(b1)y=1$由带余除法
    转证 $a_1x+b_1y=1$. 由带余除法:

$a1=(q1)b+(r1)$,其中 $0=<r1<b1$
    $a_1=q_1b+r_1$, 其中 $0\leq r_1<b_1$.

$b1=(q2)(r1)+(r2)$,其中 $0=<r2<r1$
    $b_1=q_2r_1+r_2$, 其中 $0\leq r_2<r_1$.

$(r1)=(q3)(r2)+(r3)$,其中 $0=<r3<r2$
    $r_1=q_3r_2+r_3$, 其中 $0\leq r_3<r_2$.

.....
    $$\cdots$$

$$(rn-3)=(qn-1)(rn-2)+(rn-1)$$
    $$r_{n-3}=q_{n-1}r_{n-2}+r_{n-1}.$$

$$(rn-2)=(qn)(rn-1)+(rn)$$
    $$r_{n-2}=q_nr_{n-1}+r_n.$$

$$(rn-1)=(qn+1)(rn)$$
    $$r_{n-1}=q_{n+1}r_n.$$

于是,
    于是, 

$$\gcd(a1,b1)=\gcd(b1,r1)=\gcd(r1,r2)=...=(rn-1,rn)=1$$
    $$\gcd(a_1,b_1)=\gcd(b_1,r_1)=\gcd(r_1,r_2)=\cdots=(r_{n-1},r_n)=1.$$



$$(rn-2)=(xn)(rn-1)+1$$
    $$r_{n-2}=x_nr_{n-1}+1.$$



$$1=(rn-2)-(xn)(rn-1)$$
    $$1=r_{n-2}-x_nr_{n-1}.$$

由倒数第三个式子 $(rn-1)=(rn-3)-(xn-1)(rn-2)$ 代入上式
    由倒数第三个式子 $r_{n-1}=r_{n-3}-x_{n-1}r_{n-2}$ 代入上式, 

$$1=[1+(xn)(xn-1)](rn-2)-(xn)(rn-3)$$

然后用同样的办法用它上面的等式逐个地消去 $(rn-2),...(r1)$,

可证得 $1=(a1)x+(b1)y$
    $$1=(1+x_nx_{n-1})r_{n-2}-x_nr_{n-3}.$$

    然后用同样的办法用它上面的等式逐个地消去 $r_{n-2},\cdots,r_1$,

    可证得 $1=a_1x+b_1y$.

## 应用

!!! Codeforces Round #290 (Div. 2) D. Fox And Jumping
      给出$n$张卡片,分别有 $l_i$ 和 $c_i$。在一条无限长的纸带上,你可以选择花 $c_i$ 的钱来购买卡片 $i$,从此以后可以向左或向右跳 $l_i$ 个单位。问你至少花多少元钱才能够跳到纸带上全部位置。若不行,输出 $-1$。
    
    给出 $n$ 张卡片,分别有 $l_i$ 和 $c_i$。在一条无限长的纸带上,你可以选择花 $c_i$ 的钱来购买卡片 $i$,从此以后可以向左或向右跳 $l_i$ 个单位。问你至少花多少元钱才能够跳到纸带上全部位置。若不行,输出 $-1$。
    
 分析该问题,先考虑两个数的情况,发现想要跳到每一个格子上,必须使得这些数通过数次相加或相加得出的绝对值为,进而想到了裴蜀定理。
分析该问题,先考虑两个数的情况,发现想要跳到每一个格子上,必须使得这些数通过数次相加或相加得出的绝对值为 $1$,进而想到了裴蜀定理。

 可以推出:如果 $a$ 与 $b$ 互质,那么一定存在两个整数 $x$ 与 $y$,使得 $ax+by=1$
可以推出:如果 $a$ 与 $b$ 互质,那么一定存在两个整数 $x$ 与 $y$,使得 $ax+by=1$.

由此得出了若选择的卡牌的数通过数次相加或相减得出的绝对值为 $1$ ,那么这些数一定互质,此时可以考虑动态规划求解。

不过可以转移思想,因为这些数互质,即为 $0$ 号节点开始,每走一步求 $\gcd$(节点号,下一个节点),同时记录代价,就成为了从 $0$ 通过不断 $\gcd$ 最后变为 $1$ 的最小代价。

 由于:互质即为最大公因数为 $1$,$\gcd(0,x)=x$ 这两个定理,可以证明该算法的正确。选择优先队列优化 $Dijkstra$ 求解。
由于:互质即为最大公因数为 $1$,$\gcd(0,x)=x$ 这两个定理,可以证明该算法的正确。选择优先队列优化 Dijkstra 求解。

不过还有个问题,即为需要记录是否已经买过一个卡片,开数组标记由于数据范围达到$10^9$会超出内存限制,可以想到使用 `unordered_map` (比普通的 `map` 更快地访问各个元素,迭代效率较低,详见 [STL-map](/ds/stl/map/)