第三题:T3数轴旅行
标签:裴蜀定理
题意:初始位置在
x
=
0
x=0
x=0,要去
x
=
d
x=d
x=d的位置,给定
n
n
n个整数
a
1
,
a
2
,
a
3
.
.
.
,
a
n
a_1,a_2,a_3...,a_n
a1,a2,a3...,an,表示每次可以往左移动
a
i
a_i
ai个单位或者往右移动
a
i
a_i
ai个单位,求最后能不到达
x
=
d
x=d
x=d的位置。
(
1
<
=
n
<
=
1
0
5
,
1
<
=
a
i
<
=
1
0
9
,
−
1
0
9
<
=
d
<
=
1
0
9
1<=n<=10^5,1<=a_i<=10^9,-10^9<=d<=10^9
1<=n<=105,1<=ai<=109,−109<=d<=109)
题解:经典裴蜀定理题,有兴趣的可以去看看证明,我这边直接说定理和结论。
裴蜀定理:对于
x
x
x,
y
y
y的二元一次不定方程
a
x
+
b
y
=
c
ax+by=c
ax+by=c,其有解的充要条件为
g
c
d
(
a
,
b
)
∣
c
gcd(a,b)|c
gcd(a,b)∣c。
(
g
c
d
(
a
,
b
)
∣
c
gcd(a,b)|c
gcd(a,b)∣c这个数学表示为
c
c
c能被
g
c
d
(
a
,
b
)
gcd(a,b)
gcd(a,b)整除)
由基础定理我们可以得到一个推论:
对于不定方程
x
1
y
1
+
x
2
y
2
+
.
.
.
+
x
n
y
n
=
k
x_1y_1+x_2y_2+...+x_ny_n=k
x1y1+x2y2+...+xnyn=k,
∀
y
i
∈
Z
\forall y_i \in \Z
∀yi∈Z,其有解的充要条件为
gcd
{
x
i
}
∣
k
\gcd\{x_i\}\mid k
gcd{xi}∣k。
回到本题我们可以写出这个式子,
y
i
y_i
yi可以是
−
1
-1
−1和
1
1
1:
a
1
y
1
+
a
2
y
2
+
.
.
.
+
a
n
y
n
=
d
a_1y1+a_2y_2+...+a_ny_n=d
a1y1+a2y2+...+anyn=d
那么问题就转变成了
d
d
d能否被 [ 所有
a
i
a_i
ai的最大公约数 ] 整除,能整除就有解,反之无解。
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll gcd(ll a, ll b) {
if (b == 0) return a;
return gcd(b, a % b);
}
int main() {
ll n, a, d, g = 0;
cin >> n >> d;
for (int i = 1; i <= n; i++) {
cin >> a;
g = gcd(g, a);
}
if (d % g == 0) cout << "Yes";
else cout << "No";
return 0;
}