小易的字典 排列組合

2021-09-27 05:59:47 字數 1515 閱讀 9388

很明顯按照字典序排序選取,第n個字串,很容易想到這道題目需要用到排列組合來模擬運算,不過用python3來寫比用c++來寫簡化很多的細節,實現起來相對來說簡單了很多

def cnm(a, b):

ans = 1

for i in range(a + 1, a + b + 1):

ans *= i

for i in range(1, b + 1):

ans //= i

return ans

n, m, k = map(int, input().strip().split())

if cnm(n, m) < k:

print(-1)

else:

ans = ""

while n > 0 and m > 0:

temp = cnm(n - 1, m)

if temp < k:

k -= temp

ans += "z"

m -= 1

else:

ans += "a"

n -= 1

ans += "a" * n

ans += "z" * m

print(ans)

解題思路:

排列組合,n個'a'和m個'z',只能組成$c_^n$,記為count(n+m,n) 個單詞。

思路:假設第乙個字元為a,則剩下n-1個'a'和m個'z'組成的子串行只能構成count(n-1+m,n-1)個單詞,且是字典中前count(n-1+m,n-1)個單詞。

比較k和count(n-1+m,n-1),若k小,說明k是前count(n-1+m,n-1)個單詞,則第乙個字元必為'a'。子問題化為在子串行(n-1個'a'和m個'z')找到第k個單詞

若k大,則說明第乙個字元必為'z',單詞是以'z'開頭的單詞中的第k-count(n-1+m,n-1)個。子問題化為在子串行(n個'a'和m-1個'z')找到第k-count(n+m-1,m-1)個單詞。

eg:n=2,m=2,k=5

假設第乙個字元為a,則剩下1個a,2個z只能構成3個單詞,且是字典中前3個單詞(aamm,amam,amma)

k>3,則第乙個字元必為z。原問題化為在n=2,m=1,k=2,即在剩下2個a,1個z中找到第2個單詞

#include#includeusing namespace std;

void fun(int n, int m, long long k)

if (k <= count)//如果k小於等於count,則表明首字元的確應為a

else//當前位是z

}//迴圈結束後,剩餘子串行只存在"aa..aaa" 或 "zz..zzz"1種情況

if (k != 1)

while (n--) vec.push_back('a');

while (m--) vec.push_back('z');

for (auto it : vec)

}int main()

D的小L排列組合

時間限制 4000 ms 記憶體限制 65535 kb 難度 2 描述 一天tc的匡匡找acm的小l玩三國殺,但是這會小l忙著哩,不想和匡匡玩但又怕匡匡生氣,這時小l給匡匡出了個題目想難倒匡匡 小l很d吧 輸入 第一行輸入乙個數n 0輸出 按特定順序輸出所有組合。特定順序 每乙個組合中的值從小到大排...

小奇的賞花(數學排列組合)

題目描述 小奇的花園裡有n行m列棵桃花樹,花色各不相同。小奇漫步在花園中,有時它覺得某一行 列的桃花很美,便會在這一整行 列的每棵樹下撿一枚花瓣,到了傍晚,他發現自己選擇了r行c列 同一行 列可能被選擇不止一次 的花瓣。回家之後,小奇發現 有s種顏色的花瓣數為奇數,他想知道,有多少種選擇方案能有這樣...

c 排列組合排序 排列組合 組合數專題

書接上回,本期正男老師將帶大家梳理排列組合中組合數的相關考點,組合數考點可以細分為4類,分別為 分類數數問題 分組排序問題 塗色問題以及插棍問題。近六年高考真題中,組合數考點共涉及5道。組合數專題高考真題分布 組合數的定義以及公式如下圖所示。組合數定義 分類數數問題與排列問題中的窮舉問題相似,但分類...