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.