0%

思路讲解

这个就是我们这个数在 rank=2 到 rank=i 的总和。

1
2
3
4
5
6
7
8
9
10
11
FOR(i, 2, N) {
ll lans = 0;
lans = binpow(2, N - i) * (binpow(3, i - 1) - 1);
lans %= mod;
lans *= inv2;
lans %= mod;
lans *= A[i];
lans %= mod;
ans += lans;
ans %= mod;
}

rank=1 的时候的贡献。

1
2
3
4
5
6
FOR(i, 1, N) {
ll lans = binpow(2, N - i) * A[i];
lans %= mod;
ans += lans;
ans %= mod;
}

AC代码

https://qoj.ac/submission/1345581

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

思路讲解

不难发现,可以用二分答案做。

那么思路就是发现ab,ac都可以看为是A的,但是因为ab,ac的不对称性,所以都要检验一遍。

具体check函数见下面。

1
2
3
4
5
6
7
8
9
10
11
ll a,b,c,ab,ac,bc,abc;
bool check(ll mid){
if(a+ac+ab+abc<mid) return false;
if(b+bc+ab+abc<mid) return false;
if(c+bc+ac+abc<mid) return false;
if(a+c+ab+ac+bc+abc<2*mid) return false;
if(a+b+ab+ac+bc+abc<2*mid) return false;
if(b+c+ab+ac+bc+abc<2*mid) return false;
if(N/3<mid) return false;
return true;
}

AC代码

https://vjudge.net/solution/63690535

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

思路讲解

通过打表,我们发现这个通过最大值和这个长度,我们可以唯一确定一个序列。

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
64
65
66
最大值为:1 的长度为:1 的东西:1
最大值为:2 的长度为:1 的东西:1
最大值为:2 的长度为:2 的东西:1
最大值为:3 的长度为:1 的东西:1
最大值为:3 的长度为:2 的东西:1
最大值为:3 的长度为:3 的东西:1
最大值为:4 的长度为:1 的东西:1
最大值为:4 的长度为:2 的东西:1
最大值为:4 的长度为:3 的东西:1
最大值为:4 的长度为:4 的东西:1
最大值为:5 的长度为:1 的东西:1
最大值为:5 的长度为:2 的东西:1
最大值为:5 的长度为:3 的东西:1
最大值为:5 的长度为:4 的东西:1
最大值为:5 的长度为:5 的东西:1
最大值为:6 的长度为:1 的东西:1
最大值为:6 的长度为:2 的东西:1
最大值为:6 的长度为:3 的东西:1
最大值为:6 的长度为:4 的东西:1
最大值为:6 的长度为:5 的东西:1
最大值为:6 的长度为:6 的东西:1
最大值为:7 的长度为:1 的东西:1
最大值为:7 的长度为:2 的东西:1
最大值为:7 的长度为:3 的东西:1
最大值为:7 的长度为:4 的东西:1
最大值为:7 的长度为:5 的东西:1
最大值为:7 的长度为:6 的东西:1
最大值为:7 的长度为:7 的东西:1
最大值为:8 的长度为:1 的东西:1
最大值为:8 的长度为:2 的东西:1
最大值为:8 的长度为:3 的东西:1
最大值为:8 的长度为:4 的东西:1
最大值为:8 的长度为:5 的东西:1
最大值为:8 的长度为:6 的东西:1
最大值为:8 的长度为:7 的东西:1
最大值为:8 的长度为:8 的东西:1
最大值为:9 的长度为:1 的东西:1
最大值为:9 的长度为:2 的东西:1
最大值为:9 的长度为:3 的东西:1
最大值为:9 的长度为:4 的东西:1
最大值为:9 的长度为:5 的东西:1
最大值为:9 的长度为:6 的东西:1
最大值为:9 的长度为:7 的东西:1
最大值为:9 的长度为:8 的东西:1
最大值为:9 的长度为:9 的东西:1
最大值为:10 的长度为:1 的东西:1
最大值为:10 的长度为:2 的东西:1
最大值为:10 的长度为:3 的东西:1
最大值为:10 的长度为:4 的东西:1
最大值为:10 的长度为:5 的东西:1
最大值为:10 的长度为:6 的东西:1
最大值为:10 的长度为:7 的东西:1
最大值为:10 的长度为:8 的东西:1
最大值为:10 的长度为:9 的东西:1
最大值为:10 的长度为:10 的东西:1
最大值为:11 的长度为:1 的东西:1
最大值为:11 的长度为:2 的东西:1
最大值为:11 的长度为:3 的东西:1
最大值为:11 的长度为:4 的东西:1
最大值为:11 的长度为:5 的东西:1
最大值为:11 的长度为:6 的东西:1
最大值为:11 的长度为:7 的东西:1
最大值为:11 的长度为:8 的东西:1
最大值为:11 的长度为:9 的东西:1
最大值为:11 的长度为:10 的东西:1
最大值为:11 的长度为:11 的东西:1

如果说是一个递增的一个序列,我们可以得到任何长度的序列(不大于本身值)。但是如果序列发生变化,就不行了。

1
2
3
4
5
6
7
8
9
10
11
最大值为:11 的长度为:1 的东西:1
最大值为:11 的长度为:2 的东西:1
最大值为:11 的长度为:3 的东西:1
最大值为:11 的长度为:4 的东西:1
最大值为:11 的长度为:5 的东西:1
最大值为:11 的长度为:6 的东西:1
最大值为:11 的长度为:7 的东西:1
最大值为:11 的长度为:8 的东西:1
最大值为:11 的长度为:9 的东西:1
最大值为:11 的长度为:10 的东西:1
最大值为:11 的长度为:11 的东西:1

AC代码

https://www.codechef.com/viewsolution/1191801507

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

思路讲解

我们发现,即便我们选了一个这个O(1)的,解决简单问题(单组问题的方法),好像也没什么用?所以说问题难道是引导我们怎么直接计算这个东西?我只能说是无从下手呀。

Cycle decomposition of permutations

这个东西是什么意思那?

https://nor-blog.pages.dev/posts/2023-01-09-permutations-for-beginners/

其实就是排列成环。

我们发现这个无视距离的交换就非常适合用图论来分析。

最后时间复杂度是 O(NN)O(N\sqrt N)

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
FOR(i, 1, N) {
if (fa[i] == i) {
ll freq = cnt[i];
if (freq == 1)
continue;
if (memo[freq]) {
ans += memo[freq];
ans %= mod;
continue;
}
ll lans = 0;
// 这里A的定义和题目里面反过来了,不过我认为都一样
FOR(a, 1, N) {
ll b = a - a / freq;
if (b > 1) {
// 前面是会变化的 b 来接手
lans += (freq) * (1 + b - 1) * (b - 1) / 2;
lans %= mod;
// 注意 b 的上限是 N
// 而不是 a
lans += (freq - 1) * (a + a) * (N - b + 1) / 2;
lans %= mod;
} else {
lans += (freq - 1) * (a + a) * (N - b + 1) / 2;
lans %= mod;
}
}
memo[freq] = lans;
ans += lans;
ans %= mod;
}
}

AC代码

https://www.codechef.com/viewsolution/1190700079

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

思路讲解

注释非常详细,看注释就行。

AC代码

AC

https://www.codechef.com/viewsolution/1190317643

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