首页 > 其他分享 >康托展开

康托展开

时间:2023-07-22 16:55:08浏览次数:27  
标签:int Max long 数组 ans 展开 康托

这应该是数学吧?

康托展开要求的就是解决排列问题的一种数学,具体解决的是一组数的一个合法排列在这组数的全部排列中的排名应该就只能解决这个吧?

它的解决方式也挺简单的,有一个比较方便的公式 $$ans = \sum_{i = 1}^{n} sum_{ai} * (n -
i)!$$

感性理解一下:
比如有一个序列 \(2 , 4 , 1 , 5 , 3\) , 它是序列 \(1 , 2 , 3 , 4 , 5\)的一组合法排列,要求它在其所有合法排列中的排名,该怎样求嘞?

  • 第一位是 \(2\) ,比它小的只有 \(1\) ,而它后面还有 \(4\) 位,所以总方案数就是 \(1 * 4 !\) 。
  • 第二位是 \(4\) ,比它小的有 \(1 , 2 , 3\) 但是 \(2\) 在前面已经用过了,所以合法的有 \(2\) 位,而它后面有 \(3\) 位,所以总方案数就是 \(2 * 3 !\) 。
  • 第三位是 \(1\) ,没有比它小的,所以总方案数就是 \(0\) 。
  • 第四位是 \(5\) ,比它小的有 \(1 , 2 , 3 , 4\) ,但是前面有 \(1 , 2 , 4\) 了,所以合法的有 \(1\) 位,而它后面有 \(1\) 位,所以总方案数就是 \(1 * 1 !\) 。
  • 第五位后面没有位数了所以总方案数是 \(0\) 。
    所以总方案数就是 \(1 * 4 ! + 2 * 3 ! + 0 + 1 * 1 ! + 0 = 36\) ,但是需要注意奥,这是它前面的,要求它自己的位置的话还要加一(因为它自己也算一个)。

洛谷上有一道板子题,可以顺便切掉它但是时间卡的有点紧,所以要用线段树或者树状数组优化 康托展开

下面是代码

#include <iostream>

using namespace std;
const int Mod = 998244353;
const int Max = 1000010;

long long n , ans;
long long t[4*Max] , a[Max] , x[Max];
// t是树状数组 , a是输入数组 , x是阶乘数组

long long lowbit(int x) {
	return x & (-x);
}

void add(int x , int k) {
	for(int i = x; i <= n; i += lowbit(i)) t[i] += k;
}

long long query(int x) {
	long long res = 0;
	for(int i = x; i >= 1; i -= lowbit(i)) res += t[i];
	return res;
}

signed main() {
	cin >> n;
	x[0] = x[1] = 1;
	for(long long i = 1; i <= n; i++) {
		x[i] = (x[i-1] * i) % Mod; // 阶乘
		add(i , 1); // 树状数组初始化
	}
	for(long long i = 1; i <= n; i++) {
		cin >> a[i];
		ans = (ans + ((query(a[i]) - 1) * x[n-i]) % Mod) % Mod; // 这就是上面讲的康托展开
		add(a[i] , -1); // 还原树状数组,之前是1,还原的话就是-1喽
	}
	cout << ans + 1; // 记得加上自己的那一位哦
	return 0;
}

BYE~

标签:int,Max,long,数组,ans,展开,康托
From: https://www.cnblogs.com/roselu/p/17573687.html

相关文章

  • linux 中 根据制定列标签展开为两列以及依据两列信息进行合并
     001、[root@PC1test05]#lsresult.txt[root@PC1test05]#catresult.txt##测试数据223669237092235172369632351523708323556237134234762371142362223720......
  • 关于Antd中table列Fixed导致的expandedRowRender展开行错位问题
    右侧操作列的属性为fixed:'right'在展开行时出现列错位的问题打开element发现列属性设置为fixed后在DOM中是独立出来的解决办法:<a-table:columns="columns":data-source="data"bordered:pagination="false":scroll="{......
  • vue+element-ui 点击表格某一行,展开内容
    正常情况下,表格中想要展开某一行只能通过点击最前面的小箭头,如果想要实现点击某一行后直接展开,那么首先,就要先了解这几个属性:row-key的值只能是表格中某一列的key,而expand-row-keys数组里保存的则是所有展开行的row-key值,假如设置row-key=“id”,那么expand-row-keys数组......
  • 【组合数学】康托展开 学习笔记
    康托展开将\(1...n\)的所有排列按照字典序进行排序,某个排列的排名可以通过康托展开的方法求出。原理观察排列\(2,3,1,4\)和\(2,3,4,1\),发现第一个不同的位置是第三位,而且第一个排列的第三位比第二个小,根据字典序的性质,第一个排列的排名在第二个之前。从这里我们也可以发......
  • css 超出行显示展开收起
    显示展开收起:<divclass="wrapper"><inputid="exp111"class="exp"type="checkbox"><divclass="text">......
  • 利用g++展开宏
    参考ACM学习其他人的代码时,遇到一些不习惯的宏定义方式,影响理解,但由无法直接查找替换,这里用g++将宏展开;g++-Einput_file.cpp-ooutput_file.cpp得到进行宏展开后的文件output_file.cpp;注意,其中也包含include的库文件.......
  • 康托展开
    简介:康托展开可以求解一个排列的序号,比如:12345序号为1 ,12354序号为2,按字典序增加编号递增,依次类推。康托逆展开可以求解一个序号它对应的排列是什么。 康托展开解释:先给出康托展开的公式:                          ......
  • 2023-07-13:如果你熟悉 Shell 编程,那么一定了解过花括号展开,它可以用来生成任意字符串
    2023-07-13:如果你熟悉Shell编程,那么一定了解过花括号展开,它可以用来生成任意字符串。花括号展开的表达式可以看作一个由花括号、逗号和小写英文字母组成的字符串定义下面几条语法规则:如果只给出单一的元素x,那么表达式表示的字符串就只有"x"。R(x)={x}例如,表达式"a"......
  • elment ui展开行嵌套表格 进行修改数据后展开行自动收起
    https://it.cha138.com/python/show-74200.html tags:篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ElmentPlus表格展开行后,进行修改数据后展开行自动收起相关的知识,希望对你有一定的参考价值。ElmentPlus表格展开行后,进行修改数据后展开行自动收起场景:在......
  • el-tree树点击全选按钮,全部展开并且全选
    先看图:代码如下://全部选中qxClick(){this.isQx=!this.isQx;//判断按钮的状态this.expandAll();if(this.isQx){console.log(this.isQx,"-------------------------------",this.datas);//设置this.$r......