乙個數是幸運數當且僅當這個數僅由 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 位數的全排列,我們可以根據康托展開公式確定其應當是字典序中的第 幾 個全排列。康托展開計算的就是某個全排列在該全排列集合...