題目大意:請找到第$k$大的數,滿足各位數字之和等於各位數字之積。其中$k≤10^$。
首先我們要確定這個第$k$大的數有多大
我們用$f[i][j][he][ji]$表示我們要搜尋乙個$i$位的數字,還有$j$位沒有確定,且確定的位總和為$i$,積為$j$的方案數。
我們發現:若$he+j
若$he+j=ji$,則$f[i][j][he][ji]=\binom$(這種情況下,餘下的j位均為$1$恰好可以讓和等於積,組合數的意義為將$j$個$1$插入到已經確定的i-j位數中)
若$j=0$,那麼顯然只需要判一下和是否等於積即可。
若在這三種情況外,直接列舉下一位數字($2$到$9$列舉)。
我們設第$k$大的數字位數為$x$,每次計算$f[x][x][0][1]$,若$f[x][x][0][1]
接著從大到小列舉每一位,隨後計算當該數前若干位確定時的方案數,藉此逐位確定整個數
時間複雜度為$o(??)$
1 #include2#define l long long
3#define m 505
4using
namespace
std;
5 l n,c[m][m]=;
67 l calc(int n,int m,int he,int
ji)17
18int
main()
25if(n<10)
26 n--;
27int hh=1;28
while(1)33
int he=0,ji=1;34
for(int i=hh;i;i--)43}
44}45 }
兔子的排列 題解 分治 記憶化搜尋
題目的意思就是乙個序列本來是0,1,2.n 1.然後要你變成p 0 p 1 p 2 p n 1 通過交換相鄰的兩個數每兩個相鄰的數都可以交換一次,你可以選擇交換的順序.問你有多少種交換順序?有兩種方法,一種複雜度 o n 5 一種複雜度 o n 3 首先如果乙個點換了,那麼相當於切斷了兩邊,則可以兩...
數字DP的記憶化搜尋形式
數字dp的記憶化搜尋形式比一般遞推形式好寫多了,而且一般不容易出錯。dfs求 0,n 有多少個符合的,先把n換成字串形式。cur 現在處理到哪一位。s 搜尋到目前為止,之前的狀態,具體什麼狀態看情況而定。e 是否到達邊界,如果沒到這一位只取到9,否則只能取到bit cur z 前導0標記,也就是是否...
二叉搜尋樹中最小的數字
給定乙個二叉搜尋樹,編寫乙個函式 kthsmallest 來查詢其中第 k 個最小的元素。說明 你可以假設 k 總是有效的,1 k 二叉搜尋樹元素個數。示例 1 輸入 root 3,1,4,null,2 k 13 1 42 輸出 1 示例 2 輸入 root 5,3,6,2,4,null,null,...