H - Rikka with Subset
As we know, Rikka is poor at math. Yuta is worrying about this situation, so he gives Rikka some math tasks to practice. There is one of them:
Yuta has nn positive A1−An and their sum is mm. Then for each subset S of A, Yuta calculates the sum of S.
Now, Yuta has got 2n numbers between [0,m]. For each i∈[0,m], he counts the number of iis he got as Bi.
Yuta shows Rikka the array Bi and he wants Rikka to restore A1−An.
It is too difficult for Rikka. Can you help her?
Input
The first line contains a number t(1≤t≤70), the number of the testcases.
For each testcase, the first line contains two numbers n,m(1≤n≤50,1≤m≤104)
The second line contains m+1m+1 numbers B0−Bm(0≤Bi≤2n)
Output
For each testcase, print a single line with nn numbers A1−An
It is guaranteed that there exists at least one solution. And if there are different solutions, print the lexicographic minimum one.
Sample Input
2 2 3 1 1 1 1 3 3 1 3 3 1
Sample Output
1 2 1 1 1
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll b[10005];
int a[1005];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=0;i<=m;i++)
{
scanf("%lld",&b[i]);
}
int tot=0;
for(int i=1;i<=m;i++)
{
if(b[i])
{
a[++tot]=i; //>=1的第一个不为0的数就是第一个数
break;
}
}
for(int i=1;i<=tot;i++)
{
b[a[i]]--; //自己本身的组成-1
for(int j=a[i]+1;j<=m;j++)
{
b[j]-=b[j-a[i]]; //减去这个数所给的贡献
}
for(int j=a[i];j<=m;j++)
{
if(b[j]) //还能组成的最小数,就是下一个数
{
a[++tot]=j;
break;
}
}
}
for (int i = 1; i <= tot; ++ i)
printf("%d%c" ,a[i] ,i == tot ? '\n' : ' ');
}
return 0;
}