首页 > 其他分享 >P5367 【模板】康托展开

P5367 【模板】康托展开

时间:2022-11-07 20:56:01浏览次数:47  
标签:ch int 排列 P5367 康托 模板 define

题意

求 \(1\sim N\) 的一个给定全排列在所有 \(1\sim N\) 全排列中的排名。结果对 \(998244353\) 取模。

分析

模板,又学习了一种新的东西,但好像除了做这道体外,还不知道有什么用,呜呜。

先给式子。

\(ans=1+\sum_{i=1}^{n} A[i]\times(n-i)!\)

其中 \(A[i]\)代表 \(\sum_{j=i}^{n}[a[j] < a[i]]\)

怎么来理解这个式子呢?想象构造出字典序比当前排列小的有几个排列

枚举到 \(i\) 表示 \(1\) 到 \(i-1\) 和原来的排列一样, \(i\) 位肯定不一样,之后咋样都行。

既然到 \(i\) 位不一样,那么字典序大小其实就是取决于 \(i\) 位。很明显,第 \(i\) 位肯定要小于 \(a[i]\) 。然后只要把 \(i\) 后面小于 \(a[i]\) 的数交换到 \(i\) 位,后面随便排就行了。

很明显,这样枚举可以做到不重不漏。因为要求的是排名,所以 \(ans+=1\) 。

当然要用树状数组优化一下,复杂度是 \(O(nlgn)\) 的。

\(code\)

#include<bits/stdc++.h>
#define mod 998244353
#define int long long
#define N 1000005
using namespace std;
int read(){
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-f;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
	return x*f;
}
int n,ans=1;
int a[N],c[N],fac[N]={1,1};
void add(int x,int k){for(;x<=n;x+=x&(-x)) c[x]+=k;}
int ask(int x){int sum=0;for(;x;x-=x&(-x))sum+=c[x];return sum;}
signed main(){
	n=read();
	for(int i=1;i<=n;++i) a[i]=read();
	for(int i=2;i<=n;++i) fac[i]=(fac[i-1]*i)%mod;
	for(int i=n;i;--i){
		ans=(ans+fac[n-i]*ask(a[i]))%mod;
		add(a[i],1);
	}
	printf("%d\n",ans);
	return 0;
} 

标签:ch,int,排列,P5367,康托,模板,define
From: https://www.cnblogs.com/jiangchenyyds/p/16867408.html

相关文章

  • JAVA 模板设计模式
    今天来介绍下一个我觉得蛮不错的设计模式(比较容易应用于业务场景),它就是---模板设计模式。OK,我们直接看代码:模板模式,那当然我们需要建一个模板先,建一个抽象类,VehicleControlM......
  • LG P4717 【模板】快速莫比乌斯/沃尔什变换 (FMT/FWT)
    \[C_k=\sum_{i|j=k}A_iB_j\]这样的或卷积可以做一次\(\text{FWT}\),把数组变为\(a_i=\sum_{j\subseteqi}A_i\),也就是子集和的形式,然后就可以对应位相乘了变回去的......
  • 【模板】最长回文串长度 manacher
    \(pa_i\)表示以\(i\)为中心的(原串的)回文串长度#include<cstdio>#include<cstring>#include<algorithm>usingnamespacestd;typedeflonglongLL;intn,m,pa[......
  • Elasticsearch拼音搜索:自定义分词器的模板
    PUT/test{"settings":{"analysis":{"analyzer":{"my_analyzer":{"tokenizer":"ik_max_word","filter":"py"}......
  • 通用模板对象池-转载
    一个很好用的对象池,分享一下,原文链接:https://www.cnblogs.com/hnxxcxg/p/3191622.html//标准模板unituObjPools;interfaceusesClasses,SysUtils,UntThreadTimer,......
  • 【模板】广义后缀自动机 exSAM
    postedon2022-11-0218:51:48|under模板|sourcesolution膜拜@xzzduang。我们重学一个SAM。一个点维护的是所有\(endpos=S\)的(本质不同的)串,显然这些串的长度......
  • 【模板】二元一次不定方程 exgcd
    postedon2022-09-1715:59:26|under模板|sourcecodeLLmod(LLx,LLm){return(x%m+m)%m;}LLexgcd(LLa,LLb,LLc,LL&x,LL&y){ if(!b)returnx=c/a,y=0,a;......
  • 【模板】二维数点
    postedon2022-10-2313:50:24|under模板|sourceproblem给定一个二维平面,多次询问\(x\in[l_x,r_x],y\in[l_y,r_y]\)的点有多少个。solution1(静态+在线):可持久化......
  • 【模板】网络流
    postedon2022-08-1214:14:05|under模板|source感谢讲师LQS带来的网络流专题。本文非常不严谨,请不要把它当作入门博客。0xFF目录0x00网络流及求法0x01......
  • 【模板】多项式乘法 FFT
    postedon2022-08-0223:57:12|under模板|source涉世不深,不会卡常,恳求大佬指教typedefcomplex<double>comp;constdoublePI=acos(-1);template<intN>struct......