题目大意
有 A1 到 An 的n个数构成一个集合,这个集合有 2n 个子集,每个子集的所有数相加得到一个和,有一个 B 数组,
Bi 表示和为 i(1≤i≤m) 的集合有多少个.
现在输入 n 和m 和 B0...Bm ,让你输出 A 数组(1≤n≤50,1≤m≤104,0≤Bi≤2n) 分析
我们从一些小的情况开始分析,由题目可知, B0 一定是1, B1 的值就是1的个数,对于 B2 ,我们知道它的值就是全部由1组成的和为2的集合数加上元素2的个数.我们用 Ci 表示数 i 的个数,知道i的个数之后我们可以通过在之后的
B 数组中消掉这个数的影响这样依次的得到每一个 Ci做法是,对于 Ci 不为0的每一个 i ,对于
i 之后的每一个 j ,做Bj=Bj−Bj−i 代码
#include<bits/stdc++.h>
using namespace std;
const int MAXN=100005;
long long int n,m;
int T=0;
int b[MAXN];
int ans[MAXN];
int cnt;
void Work()
{
cnt=0;
for(int i=1;i<=m;i++)
{
int t=b[i];
for(int k=1;k<=t;k++)
{
ans[++cnt]=i;
for(int j=i;j<=m;j++)b[j]-=b[j-i];
}
}
for(int i=1;i<cnt;i++) printf("%d ",ans[i]);
printf("%d\n",ans[cnt]);
}
int main()
{
scanf("%d",&T);
while(T--)
{
memset(b,0,sizeof(b));
memset(ans,0,sizeof(ans));
scanf("%d%d",&n,&m);
for(int i=0;i<=m;i++) scanf("%d",&b[i]);
Work();
}
}