左方之地 - 结论 - 组合计数
题目大意:
给定一个序列 A \mathrm A A。
问一棵Treap(点的编号是有堆性质的二叉树) ∑ x = 1 n d e p t h ( x ) ∗ A ( x ) \sum_{x=1}^n\mathrm{depth}(x)*\mathrm{A}(x) ∑x=1ndepth(x)∗A(x)的期望值是多少。
题解:
有个结论是,一个点的深度是这样的:
将其编号的中序遍历写下来,从这个点对应中序遍历的位置向左走,一开始计数器是0,每次遇到一个更小的数字就计数器++,向右同理,最后再加个1.
那么考虑期望的线性性,算x对答案的贡献,等价于计算x>y对答案有贡献的排列有多少,然后+1。
不妨钦定x在y的左边(最后还要乘以2),枚举中间隔着几个位置d,那么比y小的数字都要放在两侧,剩余的随意选:
f ( x ) = ∑ y = 1 x − 1 ∑ d = 0 n − 2 ( n − d − 2 y − 1 ) ( y − 1 ) ! ( n − y − 1 ) ! ( n − d − 1 ) f(x)=\sum_{y=1}^{x-1}\sum_{d=0}^{n-2}\binom{n-d-2}{y-1}(y-1)!(n-y-1)!(n-d-1) f(x)=y=1∑x−1d=0∑n−2(y−1n−d−2)(y−1)!(n−y−1)!(n−d−1)
最后那一项是枚举x的位置。
f ( x ) = ∑ y = 1 x − 1 ∑ d = 0 n − 2 ( n − d − 2 ) ! ( n − d − 1 ) ( n − y − 1 ) ! ( n − d − y − 1 ) ! = ∑ y = 1 x − 1 ∑ d = 0 n − 2 ( n − d − 1 ) ! ( n − d − y − 1 ) ! y ! ( n − y − 1 ) ! y ! ( n − 1 ) ! ( n − 1 ) ! = = ∑ y = 1 x − 1 ( n − 1 ) ! ( n − 1 y ) ∑ d = 0 n − 2 ( n − d − 1 y ) f(x)=\sum_{y=1}^{x-1}\sum_{d=0}^{n-2}\frac{(n-d-2)!(n-d-1)(n-y-1)!}{(n-d-y-1)!}\\ =\sum_{y=1}^{x-1}\sum_{d=0}^{n-2}\frac{(n-d-1)!}{(n-d-y-1)!y!}\frac{(n-y-1)!y!}{(n-1)!}(n-1)!\\ ==\sum_{y=1}^{x-1}\frac{(n-1)!}{\binom{n-1}{y}}\sum_{d=0}^{n-2}\binom{n-d-1}{y} f(x)=y=1∑x−1d=0∑n−2(n−d−y−1)!(n−d−2)!(n−d−1)(n−y−1)!=y=1∑x−1d=0∑n−2(n−d−y−1)!y!(n−d−1)!(n−1)!(n−y−1)!y!(n−1)!==y=1∑x−1(yn−1)(n−1)!d=0∑n−2(yn−d−1)
后半部分:
∑ d = 0 n − 2 ( n − d − 1 y ) = ∑ d = 1 n − 1 ( d y ) = ∑ x = y n − 1 ( x y ) = ( n y + 1 ) \sum_{d=0}^{n-2}\binom{n-d-1}{y}=\sum_{d=1}^{n-1}\binom{d}{y}=\sum_{x=y}^{n-1} \binom{x}{y}=\binom{n}{y+1} d=0∑n−2(yn−d−1)=d=1∑n−1(yd)=x=y∑n−1(yx)=(y+1n)
因此:
f ( x ) = ∑ y = 1 x − 1 ( n − 1 ) ! ( n − 1 y ) ( n y + 1 ) = f ( x − 1 ) + ( n − 1 ) ! ( n − 1 x − 1 ) ( n x ) f(x)=\sum_{y=1}^{x-1}\frac{(n-1)!}{\binom{n-1}{y}}\binom{n}{y+1}=f(x-1)+\frac{(n-1)!}{\binom{n-1}{x-1}}\binom{n}{x} f(x)=y=1∑x−1(yn−1)(n−1)!(y+1n)=f(x−1)+(x−1n−1)(n−1)!(xn)
最后答案就是:
∑ x = 1 n A ( x ) [ 2 f ( x ) n ! + 1 ] \sum_{x=1}^n\mathrm{A}(x)\left[\frac{2f(x)}{n!}+1\right] x=1∑nA(x)[n!2f(x)+1]
就做完了。
upd:其实后面还可以继续稍微化简一下:
f ( x ) = f ( x − 1 ) + n ! x f(x)=f(x-1)+\frac{n!}{x} f(x)=f(x−1)+xn!不过没啥本质区别就是了……
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define Rep(i,v) rep(i,0,(int)v.size()-1)
#define lint long long
#define mod 998244353
#define db long double
#define pb push_back
#define mp make_pair
#define fir first
#define sec second
#define gc getchar()
#define debug(x) cerr<<#x<<"="<<x
#define sp <<" "
#define ln <<endl
using namespace std;
typedef pair<int,int> pii;
typedef set<int>::iterator sit;
inline int inn()
{int x,ch;while((ch=gc)<'0'||ch>'9');x=ch^'0';while((ch=gc)>='0'&&ch<='9')x=(x<<1)+(x<<3)+(ch^'0');return x;
}
const int N=100010;
int fac[N],facinv[N];
inline int C(int n,int m) { if(n<0||m<0||n<m) return 0;return (lint)fac[n]*facinv[n-m]%mod*facinv[m]%mod; }
inline int fast_pow(int x,int k,int ans=1) { for(;k;k>>=1,x=(lint)x*x%mod) (k&1)?ans=(lint)ans*x%mod:0;return ans; }
inline int prelude(int n)
{rep(i,fac[0]=1,n) fac[i]=(lint)fac[i-1]*i%mod;facinv[n]=fast_pow(fac[n],mod-2);for(int i=n-1;i>=0;i--) facinv[i]=(i+1ll)*facinv[i+1]%mod;return 0;
}
int a[N],f[N];
int main()
{int n=inn(),ans=0;prelude(n);rep(i,1,n) a[i]=inn()%mod;f[1]=0;rep(x,2,n) f[x]=(f[x-1]+(lint)fac[n-1]*fast_pow(C(n-1,x-1),mod-2)%mod*C(n,x)%mod)%mod;rep(x,1,n) ans=(ans+a[x]*(2ll*f[x]%mod*facinv[n]%mod+1)%mod)%mod;return !printf("%d\n",ans);
}
左方之地 - 结论 - 组合计数相关推荐
- 解题报告(五)组合计数(ACM / OI)超高质量题解
繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...
- 基础组合计数常用的概念和方法总结
基础组合计数常用的概念和方法总结 一.组合计数中的基本概念与性质 1.排列 定义 性质 2.组合 定义 性质 二.组合计数中的一些常用技巧 1.容斥原理 定义 公式 2.捆绑与插空法 捆绑法 插空法 ...
- 《算法竞赛进阶指南》数论篇(3)-组合计数,Lucas定理,Catalan数列,容斥原理,莫比乌斯反演,概率与数学期望,博弈论之SG函数
文章目录 组合计数 例题:Counting swaps Lucas定理 Cnm≡Cnmodpmmodp∗Cn/pm/p(modp)C_n^m\equiv C_{n\ mod\ p}^{m\ mod\ ...
- 解题报告(二)E、(BZOJ3513) [MUTC2013] idiots(生成函数 + FFT + 组合计数)
繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...
- CF1237F Balanced Domino Placements(组合计数,dp)
CF1237F Balanced Domino Placements Solution 显然可以先考虑横着的骨牌,再考虑竖着的骨牌.但是思路卡在了选取横着的骨牌会对竖着的骨牌的相邻对数产生影响. 然而 ...
- 【Luogu4921】情侣?给我烧了!(组合计数)
[Luogu4921]情侣?给我烧了!(组合计数) 题面 洛谷 题解 很有意思的一道题目. 直接容斥?怎么样都要一个平方复杂度了. 既然是恰好\(k\)对,那么我们直接来做: 首先枚举\(k\)对人出 ...
- 1307 牡牛和牝牛(组合计数-递推)
1. 问题描述: 约翰要带 N 只牛去参加集会里的展示活动,这些牛可以是牡牛,也可以是牝牛.牛们要站成一排,但是牡牛是好斗的,为了避免牡牛闹出乱子,约翰决定任意两只牡牛之间至少要有 K 只牝牛.请计算 ...
- 学组合数学心得与题解(一)——组合计数
今天我在某网站上稍微学习了一下组合数学,准确来讲,今天就看了看组合计数.像一些弱智的排列数.组合数大家肯定在小学奥数就已经精通了(只有我这种蒟蒻忘的精光).当然,博主比较菜,连二项式定理.帕斯卡恒等式 ...
- 数学知识——组合计数
组合计数 文章目录 组合计数 概述 动态规划 牡牛和牝牛 思路 代码 隔板法 方程的解 思路 代码 序列统计 思路 代码 加法 & 乘法原理 加法原理 乘法原理 车的摆放 思路 代码 容斥原理 ...
最新文章
- 字节总监的开发手记,知乎5000+点赞!
- 宏基因组公众号创立初衷及如何注册一个名字好记的公众号
- lenovo L480 进入bios_重装系统重启后不引导,重装系统无法进入引导
- BI工具和数据中台有什么区别?数据中台初探
- Apache整合Tomcat
- Java并发编程之synchronized关键字解析
- Flask框架——上下文、flask_script扩展
- POJ 1054 The Troublesome Frog(枚举 + 剪枝)
- echarts图表自适应
- access的papersize命令_巡检命令及查看参数
- ASP.NET的权限问题
- 深度学习2.0-26.Regularization减轻overfitting
- 20. Feature分支
- 04.spring boot配置文件--yml
- java opencv gamma_OpenCV函数cvAddWeighted调整alpha和gamma值 | 学步园
- 计算机网络 复习提纲(完整版)
- Android源码查看下载
- html如何自动获取屏幕高度,css如何获取屏幕高度?
- Spire.Doc 教程:如何将Word转换为PDF
- php视频怎么转mp4,PHP实现将视频转成MP4并获取视频预览图的方法_php技巧
热门文章
- 虚幻引擎5.1现已发布!
- 移动硬盘(USB3.0)2TB在自己电脑上突然识别不了。。
- java 获取一天的起始时间和结束时间
- 高中生参加的计算机奥赛是,电脑奥赛中最寂寥的竞赛 5学生夺牌直通清华
- 启动SpringBoot 错误: 找不到或无法加载主类 com.xx.xxApplication
- 程序员缓解职业病的秘方
- 如何让PDF转换成Excel
- Android答题计时的代码,Android答题倒计时
- c语言自定义创建文件,c语言自定义文件名?
- supervised domain adaption