裴蜀定律

裴蜀定律 : 若 a,b 是整数,且 gcd(a, b) = d ,那么对于任意的整数 x, y, ax + by 都一定是 d 的倍数,特别地,一定存在整数 x, y ,使 ax + by = d 成立。

它的一个重要推论是:a,b互质充分必要条件是存在整数x,y使ax+by=1.

设a1,a2,a3......an为n个整数,d是它们的最大公约数,那么存在整数x1......xn使得\(x1*a1+x2*a2+...xn*an=d\)

特别来说,如果a1...an互质(不是两两互质),那么存在整数x1......xn使得\(x1*a1+x2*a2+...xn*an=1。\)

例题

链接 : https://codeforces.com/contest/1478/problem/D

题意

给定 n 个数, 和一个目标数 q, 问能否通过操作这 n 个数, 选定其中的 2 个, 得到 \(x * 2 - y\) 的方式得到 q

思路

\(x * 2 + y\) 可以看成 \(x + x - y\) , 构造一个数组 a : ai = xi - xi-1, 所有的差 x - y 都可以数组 a 表示出来.

所以只要求出 a 的 gcd, 找到对应的 xi , 使得 \(x_i + k * d == q\) 即可满足题意, k ∈ Z.

这里的 xi 实际上可以任选, 因为任意的 xj 都可以表示为 \(x_i + x_j - x_i\)

代码
#include <bits/stdc++.h>
using namespace std;
#define IO ios::sync_with_stdio(false);cin.tie(0); cout.tie(0)
inline int lowbit(int x) { return x & (-x); }
#define ll long long
#define pb push_back
#define PII pair<int, int>
#define fi firt
#define se second
#define inf 0x3f3f3f3f
const int N = 2e5 + 10;
ll x[N];

int main() {
    IO;
    int _;
    cin >> _;
    while (_--) {
        ll n, q;
        cin >> n >> q;
        for (int i = 0; i < n; ++i) cin >> x[i];
        ll d = 0;
        for (int i = 1; i < n; ++i) d = __gcd(d, abs(x[i] - x[i - 1]));
        if ((q - x[0]) % d == 0) puts("YES");
        else puts("NO");
    }
    return 0;
}


posted @ 2021-01-29 19:20  phr2000  阅读(91)  评论(0编辑  收藏  举报