裴蜀定理的应用
定理
内容
设a,b是不全为0的整数,对于任意正整数x,y,满足gcd(a,b)|ax + by,且存在整数x,y,使得ax+by = gcd(a,b)。
推论
①如果 ax + by = c 有解,那么 c % gcd(a,b) = 0 。 也加贝祖定理。
②如果 ax + by = 1 有解,那么 a,b互质。
③如果 \(a_1x_1 + a_2x_2 + a_3x_3 +...+a_nx_n = X\),那么 \(X\) % \(gcd(a_1,a_2,a_3,...,a_n)=0\)
题目一

示例
input
16
2 1 2
3 1 3
67 1 2
100 1 2
8 6 8
9 6 8
10 6 8
11 6 8
12 6 8
13 6 8
14 6 8
15 6 8
16 6 8
1314 6 8
1994 1 13
1994 7 12
output
Case #1: Iaka
Case #2: Yuwgna
Case #3: Yuwgna
Case #4: Iaka
Case #5: Iaka
Case #6: Iaka
Case #7: Yuwgna
Case #8: Yuwgna
Case #9: Iaka
Case #10: Iaka
Case #11: Yuwgna
Case #12: Yuwgna
Case #13: Iaka
Case #14: Yuwgna
Case #15: Iaka
Case #16: Iaka
思路
考虑更相减损术
gcd(a,b) = gcd(b - a,b)
再考虑裴蜀定理
\(ax + by = gcd(a,b)\)
如果存在\(i\),满足\(i|gcd(a,b)\),那么\(i\)一定可以由\(ax + by\)得到!
所以,代码就很简单,只需要判断剩下的元素,有多少个元素满足是\(gcd(a,b)\)的倍数即可!
题目二
有两个水壶,容量分别为 a 和 b 升。水的供应是无限的。确定是否有可能使用这两个壶准确得到 c 升。
如果可以得到 c 升水,最后请用以上水壶中的一或两个来盛放取得的 c 升水。
你可以:
- 装满任意一个水壶
- 清空任意一个水壶
- 从一个水壶向另外一个水壶倒水,直到装满或者倒空
输入: \(a= 3, b = 5, c = 4\)
输出: \(true\)
①将 A 壶加满 3 升水
②将 A 壶的水全部倒入B壶 3 升水
③将 A 壶加满 3 升水
④将 A 壶中的水倒入 B 壶水,直到 B 壶满了
⑤ A 壶还剩 1 升水,将B壶中的水倒完 5 升,再将A壶中的 1升水倒入B壶
⑥ 将 A 壶加满 3 升水
于是有 3x + 5y = 4,其中x = 2,y = -1,表示总共加了2 * 3 升水,倒了 1 * 5 升水
每次加水,肯定是加 a 升或 b 升;每次倒水,肯定是倒 a 升或b 升,如果最终可以达到c升,则输出 \(true\)。
代码
class Solution {
public:
bool canMeasureWater(int a, int b, int c) {
if(a + b < c) return false;
return c % gcd(a,b) == 0;
}
};

浙公网安备 33010602011771号