//hdu 6092
/*
类似筛法的递推顺序,注意细节处理
有一个f数组,在指针指向f[i]时,保证此时f[i]记录的是用所有小于i的数字加和等于i的情况数
那么f[i]和b[i]的差值就是值为i的数字的个数
下面要开始递推,充分利用已经算出f数组元素
循环整个f数组(可以加个upper上界),此时任意f[j]的值都记录的是用小于i的数字加和为j的情况数
(注意不仅仅是下标小于i的f数组元素,因为易知小于i的数加和是可以大于i的。。)
此时枚举值为i的数字个数,利用其他f[j]递推
f[j+i*k]+=c(k,con(i))*f[j]
只有存在值为i数字时才开始枚举,所以总枚举次数不超过n次,而每次枚举时几乎循环整个f数组,故时间复杂度O(nm)
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <vector>
#include <queue>
#include <cmath>
#include <algorithm>
#include <map>
using namespace std;
#define ll long long 
#define fr(i,a,b) for(int i=a;i<=b;i++)
#define frr(i,a,b) for(int i=a;i>=b;i--)
#define ms(a,b) memset(a,b,sizeof(a))
#define scfd(a) scanf("%d",a)
#define scflf(a) scanf("%lf",a)
#define scfs(a) scanf("%s",a)
#define ptfd(a) printf("%d\n",a)
#define ptfs(a) printf("%s\n",a)
#define showd(a,b) printf(a"=%d\n",b)
#define showlf(a,b) printf(a"=%lf\n",b)
#define shows(a,b) printf(a"=%s\n",b)
#define mmcp(a,b) memcpy(a,b,sizeof(b))
const int MAXN=10005;
ll f[MAXN];
ll b[MAXN],a[MAXN];
ll cc[55][55];
int cases;
int con[MAXN];
int n,m,sum,upper;
void pushf(int now){
	ll t[MAXN];
	int tupper=upper;
	fr(i,0,upper)
		t[i]=f[i];
	if(con[now])
		for(int i=1;i<=con[now];i++)
			for(int j=0;j<=upper;j++){
				if(j+i*now<=m){
					tupper=max(j+i*now,tupper);
					f[j+i*now]+=cc[con[now]][i]*t[j];
				}
			}
	upper=tupper;
}
int main(){
	//freopen("1.in","r",stdin);
	//freopen("1.out","w",stdout);
	ios::sync_with_stdio(false);
	cin>>cases;
	cc[1][0]=cc[1][1]=1LL;
	fr(i,2,52){
		cc[i][0]=1LL;
		for(int j=1;j<=i;j++)
			cc[i][j]=cc[i-1][j-1]+cc[i-1][j];
	}
	while(cases--){
		cin>>n>>m;
		ms(f,0);
		ms(con,0);
		f[0]=1;
		upper=sum=0;
		fr(i,0,m)
			cin>>b[i];
		int now=1;
		ll tsum=0;
		while(sum<n&&tsum<m&&now<m){
			con[now]=b[now]-f[now];
			//cout<<"f="<<f[now]<<" con="<<con[now]<<" now="<<now<<" con="<<con[now]<<endl;
			sum+=con[now];
			tsum+=con[now]*now;
			pushf(now++);
		}
		int connow=n;
		fr(i,1,m){
			fr(j,1,con[i]){
				cout<<i;
				connow--;
				if(connow)
					cout<<" ";
				else{
					cout<<endl;
					break;
				}
			}
			if(!connow)
				break;
		}
	}
	return 0;
}
 posted on 2017-09-22 17:20  cylcy  阅读(110)  评论(0)    收藏  举报