題解:AT_abc367_c [ABC367C] Enumerate Sequences

Redamancy_Lydic發表於2024-08-19

大致題意

讓你按照字典序輸出一些長 \(n\) 的序列,序列中的數字有範圍,且序列和需要為 \(k\)

分析

直接深搜。搜尋的時候對從第一個元素開始,每個元素從小到大列舉所有可能的值,這樣就保證答案按照字典序升序排列。

用一個 vector 儲存序列,到達邊界之後計算一遍和,判斷是否滿足條件,然後直接輸出 vector 中的元素即可。

按照題目的資料範圍完全可以過。

Code

#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read()
{
	int w=1,s=0;char ch=getchar();
	while(!isdigit(ch)){if(ch=='-') w=-1;ch=getchar();}
	while(isdigit(ch)){s=s*10+(ch-'0');ch=getchar();}
	return w*s;
}
const int maxn=1e6+10;
const int mod=1e9+7;
int n,k;
int a[maxn];
void dfs(int x,vector<int> ans)
{
	if(x>n)
	{
		int sum=0;
		for(auto i : ans)sum+=i;
		if(sum%k)return ;
		for(auto i : ans)cout<<i<<' ';
		cout<<'\n';
		return ;
	}
	for(int i=1;i<=a[x];i++)
	{
		ans.push_back(i);
		dfs(x+1,ans);
		ans.pop_back();
	}
}
signed main()
{
//	freopen("xxx.in","r",stdin);
//	freopen("xxx.out","w",stdout);
	cin>>n>>k;
	for(int i=1;i<=n;i++)
	{
		a[i]=read();
	}
	vector<int> v;
	dfs(1,v);
	return 0;
}

相關文章