当前位置:   article > 正文

codeforces1478 D. Nezzar and Board(裴蜀定理)_codeforces数列中任选两个数互相取余最小

codeforces数列中任选两个数互相取余最小

题意:最初有n个数,每次操作可以选取两个数 x, y,将 2x - y 添加到数列里(x, y不擦除),问是否可以组合出数k

思路:

2x - y = x + (x - y),即每次操作相当于x + 任意差值的线性组合,可以发现a3 - a1 = (a3 - a2) + (a2 - a1),不相邻的两个数的差值可以由相邻的数的差值表示出来,所以只求相邻两数的差值即可。

由n个数的裴蜀定理

 可知这n - 1个差值能组合出的数一定是它们gcd的倍数,即 (k - a[i])一定是gcd的倍数,由于原数列中的任何一个数都可以由a[1] + 差值表示出来,所以只判断a[1]即可。

参考:https://blog.csdn.net/kaka03200/article/details/113384470

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const ll inf = 0x3f3f3f3f3f3f3f3f;
  5. const ll mod = 1e9 + 7;
  6. const int N = 2e5 + 7;
  7. ll a[N];
  8. ll gcd(ll a, ll b) {
  9. return b ? gcd(b, a % b) : a;
  10. }
  11. int main() {
  12. int t, n;
  13. ll k;
  14. scanf("%d", &t);
  15. while(t--) {
  16. scanf("%d%lld", &n, &k);
  17. ll gd;
  18. for(int i = 1; i <= n; ++i) {
  19. scanf("%lld", &a[i]);
  20. if(i == 1) continue;
  21. else if(i == 2) gd = a[i] - a[i - 1];
  22. else gd = gcd(gd, a[i] - a[i - 1]);
  23. }
  24. if((k - a[1]) % gd == 0) printf("YES\n");
  25. else printf("NO\n");
  26. }
  27. return 0;
  28. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/75419
推荐阅读
相关标签
  

闽ICP备14008679号