A.

答案显然是 $a_0\ \text{and}\ a_1…$。

B.

贪心。

C.

如果全是 $i \to n+1$,那么可以直接 $1…n+1$。

如果全是 $n+1 \to i$,那么可以直接 $n+1,1…n$。

否则考虑 $1..n+1…n$。

D.

D1 可以直接能连就连

1
2
3
4
5
6
7
8
9
10
11
12
13
14
vector<tuple<int, int>> edge;
rep (i, 0, n) {
rep (j, i, n) {
if (find0(i) != find0(j) && find1(i) != find1(j)) {
edge.emplace_back(i, j);
p0[find0(i)] = find0(j);
p1[find1(i)] = find1(j);
}
}
}
cout << (int) edge.size() << "\n";
for (int i = 0; i < (int) edge.size(); i++) {
cout << get<0>(edge[i]) + 1 << " " << get<1>(edge[i]) + 1 << "\n";
}

D2 可以改进一下 D1 的做法,先随机连两百万次,这样连通块个数就会变少,再对连通块直接进行暴力连边,能过。


题解的做法大概是把都与能和 1 连的全都连上,然后还剩下 $cnt1$ 个在第一个图里面不能和 1 连边的但是在第二个图已经连过边了,$cnt2$ 同理,所以还可以额外添加 $\min{cnt1,cnt2}$ 个。

E.

  • $l_i \leq a_i \leq r_i$
  • $\sum a_i \leq m$
  • $\gcd(a_1, … , a_n) = 1$。

$n \leq 50, m\leq1e5$,求方案数。

考虑容斥,$ans_d$ 为 $\gcd = d$ 的倍数的方案数,那么最终的答案是 $\sum ans_d \times \mu_d$,$\mu$ 为莫比乌斯函数。

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
int n, m;
cin >> n >> m;
vector<int> l(n);
vector<int> r(n);
for (int i = 0; i < n; i++) {
cin >> l[i] >> r[i];
--l[i];
}
vector<int> mu(m + 1);
mu[1] = 1;
for (int i = 1; i <= m; i++) {
for (int j = i * 2; j <= m; j += i) {
mu[j] -= mu[i];
}
}
int ans = 0;
for (int d = 1; d <= m; d++) {
if (!mu[d]) {
continue;
} else {
int lim = m / d;
int sum = 0;
for (int i = 0; i < n; i++) {
sum += l[i] / d + 1;
}
if (sum > lim) {
continue;
}
int t = lim - sum;
vector<int> f(t + 1);
f[0] = 1;
for (int i = 0; i < n; i++) {
int v = r[i] / d - l[i] / d;
for (int j = 1; j <= t; j++) {
f[j] += f[j - 1];
if (f[j] >= P) {
f[j] -= P;
}
}
for (int j = t; j >= v; j--) {
f[j] -= f[j - v];
f[j] += f[j] >> 31 & P;
}
}
int cur = 0;
for (int i = 0; i <= t; i++) {
cur += f[i];
if (cur >= P) {
cur -= P;
}
}
if (mu[d] == 1) {
ans += cur;
if (ans >= P) {
ans -= P;
}
} else {
ans -= cur;
ans += ans >> 31 & P;
}
}
}
cout << ans << "\n";

背包部分可以采用 $\frac{1-x^v}{1-x} = (1+…x^{v-1})$(等比数列求和)。