逆康托展開 幸運數與排列

2021-10-09 23:01:33 字數 1014 閱讀 7349

乙個數是幸運數當且僅當這個數僅由 4 和 7 構成,比如 47,744,4747。

詢問在 1 到 n 的全排列中字典序第 k 小的排列中,有多少個幸運數在排列中的位置編號也是幸運數。

由於13!>1e9,所以只需要考慮後面13位,這個康拓逆展開就行。前面的東西數字dp一下就行。

#include

#define ll long long

using

namespace std;

const ll fac[14]

=;int f[11]

,a[11

],n,k,x;

intdfs

(int u,

int aii,

int _0)if(

!_0&&

!aii) f[u]

=yjy;

return yjy;

}bool

check

(int x)

return bz;

}int

solve1

(int x)

return

dfs(k-1,

1,1)

;}intsolve2

(int n,

int x,

int k)

int j=n-x+

1,res=0;

for(

int i:a)

return res;

}int

main()

memset

(f,-1,

sizeof

(f))

;while

(k>fac[x]

) x++

;int ans=

solve1

(n-x)-1

; ans+

=solve2

(n,x,k-1)

;printf

("%d"

,ans)

;}

康托展開與康托逆展開

康托展開,用人話說出來.就是把乙個陣列的多種排序情況對應用數字表示出來 公式 x a i n 1 a i 1 n 2 a 1 0 其中a i 表示後面比該元素小的元素的個數 舉個例子,有5個數1 2 3 4 5 共有5個元素,所以一共有5!種排序方法 如果用康托展開序列35142 第乙個元素是3,在...

康托展開與逆康托展開

1.康托展開 康托展開是乙個全排列到乙個自然數的雙射,常用於構建hash表時的空間壓縮。設有n個數 1,2,3,4,n 可以有組成不同 n 種 的排列組合,康托展開表示的就是是當前排列組合 例如對於 1 4 的乙個全排列,1,2,3,4 和 4,3,2,1 分別為第乙個和最後乙個排列。康托展開公式為...

康托展開與康托逆展開

舉例,對於 1 4 的乙個全排列 1,2,3,4 和 4,3,2,1 我們知道,按字典序,前者是該全排列集合的第乙個,後者是該集合的最後乙個。那麼,所謂康托展開,就是給定乙個 n 位數的全排列,我們可以根據康托展開公式確定其應當是字典序中的第 幾 個全排列。康托展開計算的就是某個全排列在該全排列集合...