hdu6092(留以纪念)


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  n n positive  A1An A1−An and their sum is  m m. Then for each subset  S S of  A A, Yuta calculates the sum of  S S

Now, Yuta has got  2n 2n numbers between  [0,m] [0,m]. For each  i[0,m] i∈[0,m], he counts the number of  i is he got as  Bi Bi

Yuta shows Rikka the array  Bi Bi and he wants Rikka to restore  A1An A1−An

It is too difficult for Rikka. Can you help her?   
Input
The first line contains a number  t(1t70) t(1≤t≤70), the number of the testcases. 

For each testcase, the first line contains two numbers  n,m(1n50,1m104) n,m(1≤n≤50,1≤m≤104)

The second line contains  m+1 m+1 numbers  B0Bm(0Bi2n) B0−Bm(0≤Bi≤2n).
Output
For each testcase, print a single line with  n n numbers  A1An 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 <iostream>

#include <stdio.h>

#include <string.h>

#include <math.h>

#include <algorithm>

int mm[10005];

int la[10005],ans[55];

long long a[10005];

using namespace std;


int main()

{

    int t,n,m;

    cin>>t;

    while(t--)

    {

        scanf("%d %d",&n,&m);

        

        for(int i=0;i<=m;i++)

        {

            scanf("%lld",&a[i]);

        }

        memset(la,0,sizeof(la));

        la[0]=1;

        

        for(int i=1;i<=n;i++)

        {

            int k=1;

            while(a[k]==0)

                k++;

            ans[i]=k;

            for(int j=m;j>=0;j--)

            {

                if(j+k<=m)

                {

                    la[j+k]+=la[j];

                    a[j+k]-=la[j];

                }

            }

        }

        for(int i=1;i<n;i++)

            printf("%d ",ans[i]);

        printf("%d\n",ans[n]);

    }

    return 0;

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值