CF 1477A. Nezzar and Board

傳送門ios

 

 

思路:c++

從k = 2 * x - y ==> 2 * x = k + y ,能夠看出x是k,y的中間值,則若是存在x1,x2,且x1 = x2 ± 1,則經過x1,x2獲得全部整數,則任意的k都成立。數組

例如:2 3 ===>  2 3 4 ===>   1 2 3 4 ...... spa

對於該數組A: (0 6 9 12 20),咱們能夠獲得a[i] - a[i - 1]的數組(6,3,3,8)。3d

能夠獲得A對於元素能夠表示一個集合:code

a[1] -> a[1] + 6 * nblog

a[2] -> a[2] + 3 * nci

a[3] -> a[3] + 3 * nget

a[4] -> a[4] + 8 * nit

而咱們只須要確認,這些集合合併以後是否存在x1,x2且x1 =  x2 ± 1.咱們任取兩個集合 a(x) + p * n , a(y) + q * m(n,m ∈ Z),

則須要存在

  a(x) - p * n - ( a(y) + q * m ) = 1 

==> q * m - p * n = 1 * (1 - a(x) + a(y)) 有解,假設右邊爲T,則gcd(p, m) | T,若是a[i] - a[i-1]數組中存在兩個差值的gcd = 1,則必定有解。咱們只需求

gcd(a[i - 1] - a[i], a[i - 2] - a[i - 1]....) = GCD判斷是否是1便可,若是爲1,則能夠說明全部A集合合併後能夠表示爲 a[1] + n (n∈Z),即必定有解;若是不爲1,

全部數合併的集合也能夠表示爲a[1] + GCD * n (n∈Z),判斷k是否是屬於a[1] + GCD * n的集合的一個元素便可。

固然以上是經過樣例推出,不嚴謹,如下給出其中一個遺漏點的證實。

假設數組:

a b c d 若是 2 * b - a = key ,則

a b c key d

咱們須要證實gcd(b - a, c - b, d - c) = gcd(b - a, c - b, 2 * b - a - c, d - (2 * b - a) ),經過gcd的兩個性質:

①gcd(a, b, c) = gcd(a, gcd(b, c))

②gcd(a, b) = gcd(a, b - a) = gcd(a, b + a)

假設gcd(b - a, c - b, 2 * b - a - c, d - (2 * b - a) ) = T, 

T = gcd(b - a, c - b,   gcd(2 * b - a - c, d - (2 * b - a)  )       )

經過  d - (2 * b - a) + (2 * b - a - c) = d - c,

T = gcd(...,  gcd(2 * b - a - c, d - c)) 

T = gcd(b - a, d - c,  gcd(c - b, 2 * b - a - c)   )

經過  2 * b - a - c - (c - b) = b - a

T = gcd(b - a , c - b, c - d),因此左邊=右邊。

 

 1 #include <bits/stdc++.h>
 2 
 3 using namespace std;
 4 #define ll long long
 5 
 6 const int N = 3e5 + 10;
 7 ll a[N];
 8 
 9 void solve()
10 {
11     int T;
12     cin >> T;
13     while(T--) {
14         int n;
15         ll k;
16         cin >> n >> k;
17         for(int i = 1; i <= n; ++i) cin >> a[i];
18         ll gcd = 0;
19         for(int i = 2;  i <= n; ++i) {
20             gcd = __gcd(gcd, a[i] - a[i - 1]);
21         }
22         if(abs(a[1] - k) % gcd) cout << "NO" << endl;
23         else cout << "YES" << endl;
24     }
25 }
26 
27 int main(){
28 
29     ios::sync_with_stdio(false);
30     cin.tie(0); cout.tie(0);
31     solve();
32 
33     return 0;
34 }
相關文章
相關標籤/搜索