感謝zly告訴我這個知識點
附上比較不錯的模板
例題:康托展開)
康托逆展開)
此題是理解康托展開非常好的例子
就該題而言會不會康托展開都會想到用排列組合計算比該序列小的序列有多少個
我也認為這就是康托展開的原理:
記錄當前序列為該序列字典序中的第n大(等同於對映為整形值),由於其序列唯一性,則可通過序列編號逆運算出原序列。
由於是自己推的, 不保證正確性,待我再深入學習學習再修改
typedef long long ll;
const int maxn = 1e6 + 10;
int cnt[maxn] = ;
int main()
cnt[i] = rsum;
}for(ll i = rs.length() - 2, x = 1, rs = 1; i >= 0; i--, rs++)
cout《逆展開:
預處理fac階乘陣列
從尾部依次除fac[len - i](i from 1 to len) 除數為比該數小的數的個數
然後n方暴力查詢 去掉該數 並修改其後陣列數量 -1 動態更新,保證解的唯一性
用過我直接標-1 減了還減 反正也匹配不上 比較方便
typedef long long ll;
const int maxn = 1e3 + 10;
char arr[maxn] = "abcdefghijkl";
int fac[maxn] = ;
int main()
ll rx;
cin>>rx;
--rx;
for(int i = 11; i >= 0; i--)
break;}}
}for(char x : ans)
cout
}return 0;
}
康托展開和逆康托展開
為什麼我在en wiki上查不到啊tat 嗯,康托展開就是乙個從n排列集合到自然數集合的對映.並且這個對映剛好對應了字典序.比如,設這個函式為c,那麼c 0,c 5,c 3.用於排列與數字的轉換.使用的時候一定要注意先把排列離散化成0,1,n 1的排列再做.否則要用n 2的時間來找 在全集中比數i小...
康托展開和康托逆展開
x a n n 1 a n 1 n 2 a i i 1 a 1 0 其中,a i 為整數,並且x a n n 1 a n 1 n 2 a i i 1 a 1 0 這就是康托展開。1324是排列數中第幾個大的數 第一位是1小於1的數沒有,是0個,0 3 第二位是3小於3的數有1和2,但1已經在第一位了...
康托展開和逆康托展開
康托展開是乙個全排列到乙個自然數的雙射,常用於構建hash表時的空間壓縮。設有n個數 1,2,3,4,n 可以有組成不同 n 種 的排列組合,康托展開表示的就是是當前排列組合在n個不同元素的全排列中的名次。x a n n 1 a n 1 n 2 a i i 1 a 1 0 其中,a i 為整數,並且...