天天看點

數字遊戲 (Standard IO)

Description

FJ和他的奶牛們喜歡玩一種數字遊戲:他們按某種順序在紙上寫下1~N(1<=N<=10)之間的所有數,然後把相鄰的數字相加,得到一個比原數列少一項的數列。對新數列重複上述的操作,直到整個數列隻剩一個數為止。N=4的時候,整個遊戲的流程可能如下所示:

3 1 2 4

4 3 6

7 9

16

奶牛們很快不滿足于這種簡單的遊戲,于是她們背着FJ玩起了另一個版本:對于給定的N以及最後剩下的數,求初始的數列。不幸的是,由于FJ的數學學得不是很好,這個遊戲對于他來說是有些難度的。

請你寫個程式來幫助FJ玩這個遊戲,以保持他在奶牛們心中的地位。

Input

第1行: 包括2個用空格隔開的整數:N和這N個數字經過運算後的最終結果

Output

第1行: 輸出一個完整包含1~N的長度為N的數列,它經過若幹次相鄰數加和的運算後能夠得到輸入中要求的結果。如果有多個數列符合要求,輸出字典序最小的一個。也就是說,數列中位置靠前的數字要盡量小。

題解

全排列,然後暴力。

代碼

const
  maxn=;
var
  n,m:longint;
  a,b:array [..maxn] of longint;
  f:array [..maxn] of boolean;
procedure dfs(g:Longint);
var
  ans,i,j:longint;
begin
  if (g>n) then
    begin
      b:=a;
      for i:= to n- do
        for j:=n downto i+ do
          b[j]:=b[j]+b[j-];
      if b[n]=m then
        begin
          for i:= to n do
            write(a[i],' ');
          halt;
        end;
      exit;
    end;
  for i:= to n do
    if not f[i] then
      begin
        f[i]:=true;
        a[g]:=i;
        dfs(g+);
        f[i]:=false;
      End;
End;

begin
  readln(n,m);
  fillChar(f,sizeof(f),false);
  dfs();
end.