Codeforces Round 723 Div.2
赛时通过 \(\text{A,B,C1,C2}\),排名 \(1100\)。
A
略。
B
首先可以发现 \(1111,11111,\dots\) 是没用的,因为它们都可以用 \(11,111\) 表示出来。然后我们考虑一个数 \(x\) 是否能够表示成 \(11a+111b=x(a,b\ge 0)\)。
有一个结论是假如 \(x,y\ge 0\land x\perp y\),那么所有大于 \(xy-x-y\) 的数都一定能被表示成 \(ax+by(a,b\ge 0)\) 的形式。
于是对于 \(>1099\) 的数输出 yes
,小于等于 \(1099\) 的数暴力判断即可。
C
可反悔贪心,略。
D
找一下规律可以发现相同的字母放在相邻的位置最优。于是枚举 \(4!=24\) 种排列,转化成逆序对即可。
E
好妙的题。
用大写字母表示字符串,用小写字母表示字符。
考虑在后缀数组中相邻的两个字符串 \(xY\) 和 \(aB\)。如果有 \(B<Y\) 那么一定有 \(x<a\)。否则只需要 \(x\le a\) 即可。
考虑表示一下这个东西:设 \(rk_x\) 为后缀 \(s_{x\dots n}\) 在后缀数组中的位置(位置从 \(1\) 开始),\(sa_x\) 为后缀数组。如果 \(rk_{sa_x+1}>rk_{sa_{x+1}+1}\) 则一定有 \(s_{sa_{x+1}}>s_{sa_x}\)。
重排列 \(s\) 至 \(s'\) 使得 \(s'_i=s_{sa_i}\)。于是问题转化成了:求有多少个 \(s'\) 满足 \(\forall i\in [1,n],1\le s'_i\le k\),且对于某些特定的位置有 \(s'_i>s'_{i-1}\),对于其他位置有 \(s'_i\ge s'_{i-1}\)。
大胆猜测那些特定的位置对答案没有影响,对答案有影响的只是它们的个数。记它们的个数是 \(c\)。
于是答案就是 \(\sum\limits_{x=1}^k \dbinom{x}{c}\dbinom{k-x+n-c}{n-c}\)。
推式子咕了,反正时间复杂度能做到 \(O(n)\)。