题目描述设 �r 是个 2�2 k 进制数并满足以下条件:�r 至少是个 22 位的 2�2 k 进制数。作为 2�2 k 进制数除最后一位外�r 的每一位严格小于它右边相邻的那一位。将 �r 转换为二进制数 �q 后则 �q 的总位数不超过 �w。在这里正整数 ��kw 是事先给定的。问:满足上述条件的不同的 �r 共有多少个?我们再从另一角度作些解释:设 �S 是长度为 �w 的 010
首先,我们可以观察到,满足条件的r的位数至少为2,最多为w/k+1。
接下来,我们可以考虑如何生成满足条件的r。
我们可以从高位开始生成r的每一位。设当前要生成的位是第i位,那么我们需要知道第i+1位的值。
我们可以将r的第i+1位的值从0到k-1枚举一遍,然后判断是否满足条件即可。
具体来说,我们可以用递归的方式生成r的每一位。
设当前要生成的是第i位,当前已经生成的r的值为cur。我们可以枚举第i+1位的值,从0到k-1,然后判断是否满足条件。
满足条件的话,我们可以继续递归生成下一位。
递归的终止条件是当生成的位数已经达到了w/k+1。
最后,我们可以统计满足条件的r的个数即可。
下面是具体的实现代码:
#include
int k, w; int cnt = 0;
void dfs(int i, int cur) { if (i == w / k + 1) { // 生成位数已经达到w/k+1 cnt++; return; } for (int j = 0; j < k; j++) { if (cur % k > j) { // 每一位严格小于它右边相邻的那一位 dfs(i + 1, cur * k + j); } } }
int main() { cin >> k >> w; dfs(1, 0); // 从第一位开始生成r cout << cnt << endl; return 0;
原文地址: http://www.cveoy.top/t/topic/hRlx 著作权归作者所有。请勿转载和采集!