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
ai222x
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 ...