Atcoder [ABC367C] Enumerate Sequences 题解
简要题意
给定 \(n,k\) 和 \(R_i\),你需要输出所有满足下列条件的整数序列:
- 长度为 \(n\)。
- 第 \(i\) 个元素的范围为 \([1,R_i]\)。
- 一个序列的所有元素的总和为 \(k\) 的倍数。
输出请按照按照从左至右按位从小到大的顺序输出。
题解
注意到数据范围很小,我们可以直接爆搜,这里用的是 dfs,搜索过程中记录和,在数组上做标记,记得回溯清空标记,找到符合题意的方案就输出。
#include <bits/stdc++.h>
#define _for(i, a, b) for(int i = a; i <= b; i++)
using namespace std;
const int N = 10;
int n, k, r[N], a[N];
void dfs(int x, int sum) {
if(x == n + 1) {
if(sum % k == 0) {
_for(i, 1, n) cout << a[i], putchar(' ');
putchar('\n');
} return ;
}
_for(i, 1, r[x]) {
a[x] = i;
dfs(x + 1, sum + i);
a[x] = 0;
}
return ;
}
signed main() {
cin >> n >> k;
_for(i, 1, n) cin >> r[i];
dfs(1, 0);
//cerr << clock() << "ms\n";
return 0;
}

浙公网安备 33010602011771号