题目链接:
https://codeforces.com/contest/1355/problem/D
思路:
结论:
S
<
2
N
S<2N
S<2N时Petya会输,否则会赢;
证明:
Case 1:
当
S
≥
2
N
S\geq2N
S≥2N时,我们选择
(
1
,
1
,
.
.
.
,
1
,
S
−
N
+
1
)
(1,1,...,1,S-N+1)
(1,1,...,1,S−N+1)这个序列(一共有
N
−
1
N-1
N−1个
1
1
1),且令
K
=
N
K=N
K=N;
我们需要证明任意子连续的子序列和不等于
N
N
N和
S
−
N
S-N
S−N;
(1)如果子序列不包含最后一项
(
S
−
N
+
1
)
(S-N+1)
(S−N+1),那么子序列和
S
1
S_{1}
S1一定小于等于
N
−
1
N-1
N−1,因此有
S
1
≤
N
−
1
<
N
≤
S
−
N
S_1\leq N-1<N\leq S-N
S1≤N−1<N≤S−N;
(2)如果包含最后一项,那么子序列和
S
2
S_2
S2必然大于
S
−
N
S-N
S−N,因此有
N
≤
S
−
N
<
S
−
N
+
1
≤
S
2
N\leq S-N<S-N+1\leq S_2
N≤S−N<S−N+1≤S2;
可以看出两种情况序列和都不等于
N
N
N和
S
−
N
S-N
S−N
Case 2:
当
S
<
2
N
S<2N
S<2N时,证明对于任意序列,都会产生和为
K
K
K或
S
−
K
S-K
S−K的子序列;
设原序列为
{
a
i
}
\{a_i\}
{ai}
先构造出当
{
a
i
}
\{a_i\}
{ai}的前缀和数组
{
s
1
,
s
2
,
s
3
,
.
.
.
,
s
n
}
(
m
o
d
S
)
\{s_1,s_2,s_3,...,s_n\}(mod\; S)
{s1,s2,s3,...,sn}(modS),由于
a
i
>
0
a_i>0
ai>0,因此这是一个元素不重复的数组;我们再构造一个数组
{
s
1
+
k
,
s
2
+
k
,
s
3
+
k
,
.
.
.
,
s
n
+
k
}
(
m
o
d
S
)
\{s_1+k,s_2+k,s_3+k,...,s_n+k\}(mod\; S)
{s1+k,s2+k,s3+k,...,sn+k}(modS),同理这也是一个元素不重复的数组;
我们知道这两个数组一共有
2
N
2N
2N个元素,而所有元素是属于
[
0
,
S
−
1
]
[0,S-1]
[0,S−1]的,而又因为
S
<
2
N
S<2N
S<2N,因此在这段长为
S
S
S的区间分布
2
N
2N
2N个元素,它们之间必定有重复,我们又知道同一个数组中不存在重复元素,那么重复元素必定来自不同数组;
(1)
s
i
=
s
j
+
K
(
j
>
i
)
s_i=s_j+K(j> i)
si=sj+K(j>i),则
s
j
−
s
i
=
S
−
K
s_j-s_i=S-K
sj−si=S−K,即
a
i
+
1
+
.
.
.
+
a
j
=
S
−
K
a_{i+1}+...+a_j=S-K
ai+1+...+aj=S−K;
(2)
s
i
=
s
j
+
K
(
j
<
i
)
s_i=s_j+K(j< i)
si=sj+K(j<i),则
s
i
−
s
j
=
K
s_i-s_j=K
si−sj=K,即
a
j
+
1
+
.
.
.
+
a
i
=
K
a_{j+1}+...+a_i=K
aj+1+...+ai=K;
从而得证
代码:
#include<bits/stdc++.h>
#define crr(x) cerr << "#x:" << ' ' << x << '\n';
int main() {
#ifdef MyTest
freopen("Sakura.txt", "r", stdin);
#endif
int n, s;
std::cin >> n >> s;
if(s < 2 * n) puts("NO");
else {
puts("YES");
for(int i = 0; i < n - 1; ++i) std::cout << 1 << ' ';
std::cout << s - n + 1 << '\n';
std::cout << n;
}
return 0;
}