大致題意
讓你按照字典序輸出一些長 \(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;
}