ABC242 记录
上分难!难于上青天!/ll
A
分支结构的运用
B
排序
C
暴力 DP
D
发现每一层长度都是上一层两倍,因此考虑由当前层递归到上一层。
让下表从 0 开始编号即可利用位运算方便实现
回溯的时候可以利用二进制最后一位判断填什么。
如果递归到 0 层,直接返回原串的答案
如果值为 0 了,观察每层串串首是 ...ABCABCABC...
循环,随便判断一下即可。
char Calc(char c, int x) {
int p = c - 'A';
p = p + x;
p %= 3;
return 'A' + p;
}
char dfs(int pos, int val) {
if(pos == 0) return s[val];
if(val == 0) return Calc(s[0], pos);
char c = dfs(pos - 1, val >> 1);
if(c == 'A') {
if(val & 1) return 'C';
else return 'B';
} else if(c == 'B') {
if(val & 1) return 'A';
else return 'C';
} else if(c == 'C') {
if(val & 1) return 'B';
else return 'A';
}
}
signed main()
{
cin >> s;
Q = read();
for(int i = 1, t, k; i <= Q; ++i) {
t = read(), k = read() - 1;
printf("%c\n", dfs(t, k));
}
return 0;
}
E
- 做法一:数位 DP
- 做法二:
预处理 26 的幂,线性扫一遍。特判一下前半串反转和后半串的大小关系决定是否 +1。
F
待哺
nyy /bx
设 \(f_{i,j}\) 表示黑棋填了 \(i\) 行 \(j\) 列但不一定都填的方案数。
设 \(g_{i,j}\) 表示黑棋填了 \(i\) 行 \(j\) 列但都填了的方案数。
则有
\[f_{i,j} = \binom{i \times j}{B}
\]
根据二项式反演有
\[g_{i,j} = \sum_{x=0}^{i} \sum_{y=0}^{j} (-1)^{i+j-x-y} \binom{i}{x} \binom{j}{y} f_{x,y}
\]
则答案为(枚举黑棋放几行几列,剩下的白棋随便放)
\[ans = \sum_{i=0}^{n} \sum_{j=0}^{m} \binom{n}{i} \binom{m}{j} g_{i,j} \times \binom{(n-i)(m-j)}{W}
\]
G
莫队板子。