赞
踩
在黑板上有
n
n
n个不同数
x
1...
n
x_{1...n}
x1...n,每次可以选择两个数
x
,
y
x,y
x,y,将
2
x
−
y
2x-y
2x−y写在黑板上(
x
,
y
x,y
x,y两数不擦除,还可以再用),问给定的数
k
k
k能不能出现在黑板上。
(
2
≤
n
≤
2
×
1
0
5
,
−
1
0
18
≤
k
,
x
i
≤
1
0
18
)
(2 \le n \le 2 \times 10^5,-10^{18} \le k,x_i \le 10^{18})
(2≤n≤2×105,−1018≤k,xi≤1018)
可以发现
2
x
−
y
2x-y
2x−y可以写成
x
+
(
x
−
y
)
x+(x-y)
x+(x−y),猜想是不是所有在黑板上的数都可以表示成
x
i
+
∑
i
=
1
n
∑
j
=
1
n
k
i
,
j
(
x
i
−
x
j
)
x_i+\sum_{i=1}^n\sum_{j=1}^nk_{i,j}(x_i-x_j)
xi+∑i=1n∑j=1nki,j(xi−xj)的形式。可以用归纳法证明,显然初始的
x
1...
n
x_{1...n}
x1...n都是满足的,假设目前黑板上的数都可以写成这种形式,进行一次操作,选取
x
i
+
∑
i
=
1
n
∑
j
=
1
n
a
i
,
j
(
x
i
−
x
j
)
,
x
j
+
∑
i
=
1
n
∑
j
=
1
n
b
i
,
j
(
x
i
−
x
j
)
x_i+\sum_{i=1}^n\sum_{j=1}^na_{i,j}(x_i-x_j),x_j+\sum_{i=1}^n\sum_{j=1}^nb_{i,j}(x_i-x_j)
xi+∑i=1n∑j=1nai,j(xi−xj),xj+∑i=1n∑j=1nbi,j(xi−xj),得到
x
i
+
(
x
i
−
x
j
)
+
∑
i
=
1
n
∑
j
=
1
n
(
2
a
i
,
j
−
b
i
,
j
)
(
x
i
−
x
j
)
x_i+(x_i-x_j)+\sum_{i=1}^n\sum_{j=1}^n(2a_{i,j}-b_{i,j})(x_i-x_j)
xi+(xi−xj)+∑i=1n∑j=1n(2ai,j−bi,j)(xi−xj),显然还是满足这个形式,所以黑板上所有的数都满足这种形式。且所有形如
x
i
+
∑
i
=
1
n
∑
j
=
1
n
k
i
,
j
(
x
i
−
x
j
)
x_i+\sum_{i=1}^n\sum_{j=1}^nk_{i,j}(x_i-x_j)
xi+∑i=1n∑j=1nki,j(xi−xj)的数都可以出现在黑板上,这个证明暂且不会。
那么我们就要看
k
−
x
i
k-x_i
k−xi可不可以是一个
x
i
−
x
j
x_i-x_j
xi−xj的线性组合了,这个可以用裴蜀定理来判断,但是
x
i
−
x
j
x_i-x_j
xi−xj有
O
(
n
2
)
O(n^2)
O(n2)个,不能通过此题。我们发现所有的
x
i
−
x
j
x_i-x_j
xi−xj都可以表示成
x
i
−
x
i
−
1
x_i-x_{i-1}
xi−xi−1的线性组合,
x
i
x_i
xi可以表示为
x
1
+
∑
j
=
1
i
(
x
j
−
x
j
−
1
)
x_1+\sum_{j=1}^i(x_j-x_{j-1})
x1+∑j=1i(xj−xj−1),所以黑板上的数也可以表示为
x
1
+
∑
i
=
2
n
k
i
(
x
i
−
x
i
−
1
)
x_1+\sum_{i=2}^nk_i(x_i-x_{i-1})
x1+∑i=2nki(xi−xi−1),问题就变成判断
∑
i
=
2
n
k
i
(
x
i
−
x
i
−
1
)
=
k
−
x
1
\sum_{i=2}^nk_i(x_i-x_{i-1})=k-x_1
∑i=2nki(xi−xi−1)=k−x1是否有解,用裴蜀定理判断,令
g
=
g
c
d
(
∣
x
2
−
x
1
∣
,
∣
x
3
−
x
2
∣
,
.
.
.
,
∣
x
n
−
x
n
−
1
∣
)
g=gcd(|x_2-x_1|,|x_3-x_2|,...,|x_n-x_{n-1}|)
g=gcd(∣x2−x1∣,∣x3−x2∣,...,∣xn−xn−1∣),判断
∣
k
−
x
1
∣
|k-x1|
∣k−x1∣是否能被
g
g
g整除即可。
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<cmath> #include<vector> #include<queue> #include<stack> #include<map> #include<set> #include<string> #include<bitset> #include<sstream> #include<ctime> //#include<chrono> //#include<random> //#include<unordered_map> using namespace std; #define ll long long #define ls o<<1 #define rs o<<1|1 #define pii pair<int,int> #define fi first #define se second #define pb push_back #define mp make_pair #define sz(x) (int)(x).size() #define all(x) (x).begin(),(x).end() const double pi=acos(-1.0); const double eps=1e-6; const int mod=1e9+7; const int INF=0x3f3f3f3f; const int maxn=2e5+5; ll read(){ ll x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } int t,n; ll k; ll x[maxn]; ll gcd(ll a,ll b){ if(b==0)return a; return gcd(b,a%b); } int main(void){ // freopen("in.txt","r",stdin); scanf("%d",&t); while(t--){ scanf("%d%lld",&n,&k); for(int i=1;i<=n;i++){ scanf("%lld",&x[i]); } ll g=x[2]-x[1]; for(int i=3;i<=n;i++){ g=gcd(g,abs(x[i]-x[i-1])); } if(abs(k-x[1])%g==0){ puts("YES"); } else{ puts("NO"); } } return 0; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。