0%

Nebius Round 2 (Codeforces Round 1088, Div. 1 + Div. 2)——CF-2211-B. Mickey Mouse Constructive

题目大意

题目描述

给定一个数组 aa,定义 f(a)f(a) 为将 aa 划分成一个或多个连续子数组的方案数,需满足以下条件:

  1. 每个元素恰好属于一个子数组。

  2. 所有子数组的元素和都相等。

例如,对于 a=[1,1]a=[1,1]f(a)=2f(a)=2,因为有两种合法的划分方案:

  • [1,1][1,1],此时唯一的子数组和为 22

  • [1]+[1][1]+[1],此时两个子数组和均为 11

给定两个整数 xxyy。你需要构造一个长度为 x+yx+y 的数组 aa,其中包含 xx11yy1-1
你需要求出在所有合法的数组 aa 中,f(a)f(a)最小值,并将该最小值对 676767677676767677 取模后输出。同时,你需要输出一个能达到该最小值的数组构造方案。

注意:你需要最小化的是 f(a)f(a) 本身,然后将这个最小值对 676767677676767677 取模,而不是去最小化 f(a)mod676767677f(a) \bmod 676767677 的结果。

输入格式

第一行包含一个整数 tt (1t1041 \le t \le 10^4),表示测试用例的数量。

接下来每个测试用例包含一行,包含两个整数 xxyy (0x,y21050 \le x, y \le 2 \cdot 10^5),保证 x+y1x+y \ge 1

保证所有测试用例中 xx 的总和与 yy 的总和均不超过 21052 \cdot 10^5

输出格式

对于每个测试用例,输出两行:
第一行输出 f(a)f(a) 的最小值对 676767677676767677 取模的结果。
第二行输出一个达到该最小值的数组 aa 的元素(用空格分隔)。

样例输入

1
2
3
4
5
4
2 0
1 1
6 7
1 3

样例输出

1
2
3
4
5
6
7
8
2
1 1
1
1 -1
1
-1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1
2
-1 -1 -1 1

样例解释

在第一个测试用例中,x=2x=2y=0y=0。唯一可能的数组是 a=[1,1]a=[1,1],正如题目描述中所解释的,此时 f(a)=2f(a)=2

在第二个测试用例中,x=1x=1y=1y=1。一个能使 f(a)f(a) 最小化的合法数组是 a=[1,1]a=[1,-1]。此时 f(a)=1f(a)=1,因为唯一能使所有子数组和相等的划分方式就是不进行任何分割(即 [[1,1]][[1,-1]],子数组和为 00)。

思路讲解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
void Solve() {
ll X, Y;
cin >> X >> Y;
vector<ll> A(X + Y + 2);
for (int i = 1; i <= X; ++i) {
// cout << 1 << " ";
A[i] = 1;
}
for (int i = 1; i <= Y; ++i) {
// cout << -1 << " ";
A[i + X] = -1;
}
ll s = llabs(X - Y);
ll ans = 1;
// 这里要采用求约数个数的方法
if (s != 0) {
ans = 0;
for (ll d = 1; d * d <= s; ++d) {
if (s % d == 0) {
++ans;
if (d * d != s) ++ans;
}
}
}
cout << ans << "\n";
for (int i = 1; i <= X + Y; ++i) {
cout << A[i] << " ";
}
cout << "\n";
// mod
}

AC代码

AC

https://codeforces.com/contest/2211/submission/368623804

心路历程(WA,TLE,MLE……)