xsy1143 兔子的數字 搜尋

2022-05-03 19:12:09 字數 847 閱讀 9481

題目大意:請找到第$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,...