全排列函式

2021-10-02 10:25:07 字數 1310 閱讀 5088

人類終於登上了火星的土地並且見到了神秘的火星人。人類和火星人都無法理解對方的語言,但是我們的科學家發明了一種用數字交流的方法。這種交流方法是這樣的,首先,火星人把乙個非常大的數字告訴人類科學家,科學家破解這個數字的含義後,再把乙個很小的數字加到這個大數上面,把結果告訴火星人,作為人類的回答。火星人用一種非常簡單的方式來表示數字――掰手指。火星人只有乙隻手,但這只手上有成千上萬的手指,這些手指排成一列,分別編號為1,2,3…1,2,3…1,2,3…。火星人的任意兩根手指都能隨意交換位置,他們就是通過這方法計數的。乙個火星人用乙個人類的手演示了如何用手指計數。如果把五根手指――拇指、食指、中指、無名指和小指分別編號為1,2,3,41,2,3,41,2,3,4和555,當它們按正常順序排列時,形成了555位數123451234512345,當你交換無名指和小指的位置時,會形成555位數123541235412354,當你把五個手指的順序完全顛倒時,會形成543215432154321,在所有能夠形成的120120120個555位數中,123451234512345最小,它表示111;123541235412354第二小,它表示222;543215432154321最大,它表示120120120。下表展示了只有333根手指時能夠形成的666個333位數和它們代表的數字:三進製數123123123

132132132

213213213

231231231

312312312 321321321代表的數字111

222333

444555

666現在你有幸成為了第乙個和火星人交流的地球人。乙個火星人會讓你看他的手指,科學家會告訴你要加上去的很小的數。你的任務是,把火星人用手指表示的數與科學家告訴你的數相加,並根據相加的結果改變火星人手指的排列順序。輸入資料保證這個結果不會超出火星人手指能表示的範圍。輸入格式共三行。

第一行乙個正整數nnn,表示火星人手指的數目(1≤n≤100001 \le n \le 100001≤n≤10000)。

第二行是乙個正整數mmm,表示要加上去的小整數(1≤m≤1001 \le m \le 1001≤m≤100)。

下一行是111到nnn這nnn個整數的乙個排列,用空格隔開,表示火星人手指的排列順序。輸出格式nnn個整數,表示改變後的火星人手指的排列順序。每兩個相鄰的數中間用乙個空格分開,不能有多餘的空格。輸入輸出樣例輸入 #1 複製 5

31 2 3 4 5

輸出 #1 複製 1 2 4 5 3`

#include

using

namespace std;

int a[

10005

],n,m;

intmain()

全排列函式

一 next permutation 函式,作用是輸出所有比當前排列 排列大的排列 順序為由小到大排 include include includeusing namespace std int main string str cin str while next permutation str.b...

全排列函式

nest permutation函式 向下求 include include 標頭檔案 using namespace std intmain dowhile next permutation a,a 3 這是乙個求乙個排序的下乙個排列的函式 return0 執行結果 123 1322 1323 1...

全排列函式

一 概念 從n個不同元素中任取m m n 個元素,按照一定的順序排列起來,叫做從n個不同元素中取出m個元素的乙個排列。當m n時所有的排列情況叫全排列。如果這組數有n個,那麼全排列數為n 個。比如a,b,c的全排列一共有3!6 種 分別是 二 常用操作 1.標頭檔案 include2.使用方法這裡先...