裴蜀定律
裴蜀定律 : 若 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;
}