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;
}
posted @ 2024-08-18 14:17  sunskydp  阅读(52)  评论(0)    收藏  举报