题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6092
题意:知道一个集合(数组a[])的每个元素和(子集和)为i个数b[i],求数组a[]。
/*
计数,统计每个值出现的次数。
*/
#include <bits/stdc++.h>
using namespace std;
long long b[10005+6];
long long a[100];
int main()
{
int t;
int m,n;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&m,&n);
int x=0;
for(int i=0; i<=n; i++)
scanf("%lld",&b[i]);
//找m次
for(int k=1; k<=m; k++)
{
for(int i=1; i<=n; i++)
{
///找出第一个不为0的数
if(b[i])
{
a[x++]=i;
break;
}
}
for(int j=a[x-1]; j<=n; j++)//b[i] i出现的次数
b[j]-=b[j-a[x-1]];//j的减掉a[x-1]的就是j本身的
}
/*另一种写法
int k=0;
for(int i=1; i<=m; i++) //b[0]一定为1,没用,不列入计算
{
if(k>=n) break;
if(i<=0) continue;
if(b[i]!=0)//找到第一个不为零的数
{
a[k]=i;
k++;
for(int j=i; j<=m; j++)
{
b[j]=b[j]-b[j-i];//j的减掉i的就是j本身的
}
i--;//向前更新
}
}
*/
for(int i=0; i<x; i++)
{
if(i==0)
printf("%lld",a[i]);
else
printf(" %lld",a[i]);
}
cout<<endl;
}
return 0;
}