题目链接:
HDU-6092
大意:
有两个串
Ai
和
Bi
长度分别为
n
和
对于集合
A1,2...n
的子集 有
2n
个,这些每个子集和为
S
,对应一个
现在给出
Bi
的序列,求
Ai
,若答案有多组,输出字典序最小的一组。
思路:
明显
B0
值没意义,现在考虑最从
0
开始 到第一个非零的
然后要得到减去
i
的
PS.其实没看懂多种答案要怎么解,这样构造出来就输了一个答案
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define mem(s,t) memset(s,t,sizeof(s))
#define D(v) cout<<#v<<" "<<v<<endl
#define inf 0x3f3f3f3f
//#define LOCAL
inline void read(ll &x){
x=0;char p=getchar();
while(!(p<='9'&&p>='0'))p=getchar();
while(p<='9'&&p>='0')x*=10,x+=p-48,p=getchar();
}
const ll N =1e4+10;
ll B[N];
int main() {
#ifdef LOCAL
freopen("1006.in","r",stdin);
freopen("out.txt","w",stdout);
#endif
ll t;
read(t);
while(t--){
ll n,m;
read(n);read(m);
for(int i=0;i<=m;i++){
read(B[i]);
}
ll st=0,f=1;
for(ll x=0;x<n;x++){
for(ll i=1;i<=m;i++){
if(B[i]){
st=i;
break;
}
}
if(f) printf("%lld",st),f=0;//末尾空格处理
else printf(" %lld",st);
for(ll j=st;j<=m;j++){
B[j]-=B[j-st];
}
}
puts("");
}
return 0;
}