康托展開求全排列

2021-10-12 02:37:30 字數 1005 閱讀 1337

ll kt() 

return ret;

}

void kt(ll x, int n) 

used[p[i]=k] = 1;

x %= fac[n-i];

}}

長度為 n

nn 的排列 a

aa ,有兩種操作

1 11l

llr

rr ,求 ∑i=

lrai

\sum_^a_i

∑i=lr​

ai​222x

xx, 對 a

aa 執行 x

xx 次下乙個排列

發現 q×x

≤2e10

q \times x ≤ 2e10

q×x≤2e

10,因此只會對末尾 15

1515

個數字進行修改

用逆康拓維護暴力修改末尾 15

1515

個數字,然後字首和維護即可

#include#define rint register int

#define deb(x) cerr<<#x<<" = "<<(x)<<'\n';

using namespace std;

typedef long long ll;

typedef pair pii;

const int maxn = 1e6 + 5;

int n, q, a[maxn];

int p[20], used[20];

ll fac[20], pre[maxn];

ll kt()

return ret;

}void kt(ll x, int n)

used[p[i]=k] = 1;

x %= fac[n-i]; }}

int main() else

}}

康托展開 全排列

今天找到了一篇非常好的介紹康托展開的文章!其核心是這一張圖 letter 儲存所需字母表 void initletter 初始化字母表 int fact int n 階乘 return result void output vector v 輸出生成的結果 cout endl void divisi...

康托展開 全排列

對於n個數的全排列,共有n!中排列方式,如何求某乙個序列在整個排列中的次序 從小到大 以9的全排枚舉例 842697513是1 9全排列的第幾個?高中數學排列組合問題,只需要做到不重不漏 首先看第一位為8,那麼第一位為1 7的全排列都比它小,共有7 8!個。在第一位為8的情況下,其次看第二位為4,那...

排列序數 康托展開)

如果用a b c d這4個字母組成乙個串,有4 24種,如果把它們排個序,每個串都對應乙個序號 abcd 0 abdc 1 acbd 2 acdb 3 adbc 4 adcb 5 bacd 6 badc 7 bcad 8 bcda 9 bdac 10 bdca 11 cabd 12 cadb 13 ...