裴蜀定理的应用

定理

内容

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\)

题目一

image

示例

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)\)的倍数即可!

题目二

有两个水壶,容量分别为 ab 升。水的供应是无限的。确定是否有可能使用这两个壶准确得到 c 升。

如果可以得到 c 升水,最后请用以上水壶中的一或两个来盛放取得的 c 升水。

你可以:

  • 装满任意一个水壶
  • 清空任意一个水壶
  • 从一个水壶向另外一个水壶倒水,直到装满或者倒空

输入: \(a= 3, b = 5, c = 4\)
输出: \(true\)

①将 A 壶加满 3 升水
②将 A 壶的水全部倒入B3 升水
③将 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;
    }
};
posted @ 2024-04-04 10:13  gebeng  阅读(86)  评论(0)    收藏  举报