很明顯按照字典序排序選取,第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道。組合數專題高考真題分布 組合數的定義以及公式如下圖所示。組合數定義 分類數數問題與排列問題中的窮舉問題相似,但分類...