CF1151F Sonya and Informatics(概率期望,DP,矩阵快速幂)
明明是水题结果没切掉……降智了……
首先令 $c$ 为序列中 $0$ 的个数,那么排序后序列肯定是前面 $c$ 个 $0$,后面 $n-c$ 个 $1$。
那么就能上 DP 了。(居然卡在这里……)
$f[i][j]$ 表示经过 $i$ 次操作后,前 $c$ 个数中有 $j$ 个 $0$ 的方案数。答案就是 $\dfrac{f[k][c]}{\sum f[k][i]}$。
这个状态的好处就是可以直接求出以下这些值:
- 前 $c$ 个数中 $1$ 的个数为 $c-j$
- 后 $c$ 个数中 $0$ 的个数为 $c-j$
- 后 $c$ 个数中 $1$ 的个数为 $n-2c+j$(所以 $j\ge 2c-n$)
初始状态:令初始序列前 $c$ 个数中 $0$ 的个数为 $cnt$,那么 $f[0][cnt]=1$,其它的 $f[0][i]=0$。
转移:
$$f[i][j]+=f[i-1][j](\dfrac{c(c-1)}{2}+\dfrac{(n-c)(n-c-1)}{2}+j(c-j)+(c-j)(n-2c+j))$$
括号中第一个是前 $c$ 个中交换,第二个是后 $n-c$ 个中交换,第三个是前面的 $0$ 和后面的 $0$ 交换,第四个是前面的 $1$ 和后面的 $1$ 交换。
$$f[i][j]+=f[i-1][j-1](c-j+1)^2$$
前 $c$ 个中的 $0$ 和后 $n-c$ 个中的 $1$ 交换。
$$f[i][j]+=f[i-1][j+1](j+1)(n-2c+j+1)$$
前 $c$ 个中的 $1$ 和后 $n-c$ 个中的 $0$ 交换。
然后发现第 $i$ 层之和第 $i-1$ 层有关,那么可以矩阵快速幂。
时间复杂度 $O(n^3\log k)$。
- #include<bits/stdc++.h>
- using namespace std;
- const int maxn=,mod=;
- #define FOR(i,a,b) for(int i=(a);i<=(b);i++)
- #define ROF(i,a,b) for(int i=(a);i>=(b);i--)
- #define MEM(x,v) memset(x,v,sizeof(x))
- inline int read(){
- char ch=getchar();int x=,f=;
- while(ch<'' || ch>'') f|=ch=='-',ch=getchar();
- while(ch>='' && ch<='') x=x*+ch-'',ch=getchar();
- return f?-x:x;
- }
- int n,k,a[maxn],c,cnt;
- inline int add(int a,int b){return a+b<mod?a+b:a+b-mod;}
- inline int sub(int a,int b){return a<b?a-b+mod:a-b;}
- inline int mul(int a,int b){return 1ll*a*b%mod;}
- inline int qpow(int a,int b){
- int ans=;
- for(;b;b>>=,a=mul(a,a)) if(b&) ans=mul(ans,a);
- return ans;
- }
- struct matrix{
- int a[maxn][maxn];
- matrix(){MEM(a,);}
- matrix operator*(const matrix &t)const{
- matrix ans;
- FOR(i,,c) FOR(k,,c) FOR(j,,c) ans.a[i][j]=add(ans.a[i][j],mul(a[i][k],t.a[k][j]));
- return ans;
- }
- }beg,fac,ans;
- matrix qpow(matrix a,int b){
- matrix ans;
- FOR(i,,c) ans.a[i][i]=;
- for(;b;b>>=,a=a*a) if(b&) ans=ans*a;
- return ans;
- }
- int main(){
- n=read();k=read();
- FOR(i,,n) a[i]=read(),c+=!a[i];
- FOR(i,,c) cnt+=!a[i];
- beg.a[cnt][]=;
- FOR(i,,c){
- fac.a[i][i]=(1ll*c*(c-)/+1ll*(n-c)*(n-c-)/+1ll*i*(c-i))%mod;
- if(i>=*c-n) fac.a[i][i]=add(fac.a[i][i],mul(c-i,n-*c+i));
- if(i) fac.a[i][i-]=mul(c-i+,c-i+);
- if(i!=c && i+>=*c-n) fac.a[i][i+]=mul(i+,n-*c+i+);
- }
- ans=qpow(fac,k)*beg;
- int s=;
- FOR(i,,c) s=add(s,ans.a[i][]);
- s=mul(qpow(s,mod-),ans.a[c][]);
- printf("%d\n",s);
- }
CF1151F Sonya and Informatics(概率期望,DP,矩阵快速幂)的更多相关文章
- 【CF1151F】Sonya and Informatics(动态规划,矩阵快速幂)
[CF1151F]Sonya and Informatics(动态规划,矩阵快速幂) 题面 CF 题解 考虑一个暴力\(dp\).假设有\(m\)个\(0\),\(n-m\)个\(1\).设\(f[i ...
- Codeforces 446D - DZY Loves Games(高斯消元+期望 DP+矩阵快速幂)
Codeforces 题目传送门 & 洛谷题目传送门 神仙题,%%% 首先考虑所有格子都是陷阱格的情况,那显然就是一个矩阵快速幂,具体来说,设 \(f_{i,j}\) 表示走了 \(i\) 步 ...
- CF1151F Sonya and Informatics (计数dp+矩阵优化)
题目地址 Solution (duyi是我们的红太阳) (这里说一句:这题看上去是一个概率dp,鉴于这题的概率dp写法看上去不好写,我们其实可以写一个计数dp) 首先拿到这个题目我们要能设出一个普通d ...
- bnuoj 34985 Elegant String DP+矩阵快速幂
题目链接:http://acm.bnu.edu.cn/bnuoj/problem_show.php?pid=34985 We define a kind of strings as elegant s ...
- HDU 5434 Peace small elephant 状压dp+矩阵快速幂
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5434 Peace small elephant Accepts: 38 Submissions: ...
- 【BZOJ】2004: [Hnoi2010]Bus 公交线路 状压DP+矩阵快速幂
[题意]n个点等距排列在长度为n-1的直线上,初始点1~k都有一辆公车,每辆公车都需要一些停靠点,每个点至多只能被一辆公车停靠,且每辆公车相邻两个停靠点的距离至多为p,所有公车最后会停在n-k+1~n ...
- 【BZOJ】4861: [Beijing2017]魔法咒语 AC自动机+DP+矩阵快速幂
[题意]给定n个原串和m个禁忌串,要求用原串集合能拼出的不含禁忌串且长度为L的串的数量.(60%)n,m<=50,L<=100.(40%)原串长度为1或2,L<=10^18. [算法 ...
- BZOJ5298 CQOI2018 交错序列 【DP+矩阵快速幂优化】*
BZOJ5298 CQOI2018 交错序列 [DP+矩阵快速幂优化] Description 我们称一个仅由0.1构成的序列为"交错序列",当且仅当序列中没有相邻的1(可以有相邻 ...
- Codeforces 621E Wet Shark and Block【dp + 矩阵快速幂】
题意: 有b个blocks,每个blocks都有n个相同的0~9的数字,如果从第一个block选1,从第二个block选2,那么就构成12,问对于给定的n,b有多少种构成方案使最后模x的余数为k. 分 ...
- codeforces E. Okabe and El Psy Kongroo(dp+矩阵快速幂)
题目链接:http://codeforces.com/contest/821/problem/E 题意:我们现在位于(0,0)处,目标是走到(K,0)处.每一次我们都可以从(x,y)走到(x+1,y- ...
随机推荐
- 迷你版mybatis
public class BootStrap { public static void start(){ MySqlSession sqlSession = new MySqlSession();// ...
- JSP页面的注释细节
业务场景:通过后台传参,jstl标签控制一个页签是否显示,不过现在要去掉判断,直接让页签显示 在sublime直接这样注释,然后刷新,一直找不到标签显示,其它的都是正常的 <!--<c:i ...
- HTML+css基础 css选择器的种类
css选择器的种类 标签 权重是001 类 class权重是0010 相当于255个标签选择器 Id 权重是0100相当于255个类 *通配符 代表所有的标签 权重是0000 后代选 ...
- vue的双向绑定原理浅析与简单实现
很久之前看过vue的一些原理,对其中的双向绑定原理也有一定程度上的了解,只是最近才在项目上使用vue,这才决定好好了解下vue的实现原理,因此这里对vue的双向绑定原理进行浅析,并做一个简单的实现. ...
- Python platform 模块
Python platform 模块 platform 模块用于查看当前操作系统的信息,来采集系统版本位数计算机类型名称内核等一系列信息. 使用方法: import platform # 获取操作系统 ...
- powershell与linux bash对比
转自Github/Powershell Bash PowerShell Description ls dir, Get-ChildItem List files and folders tree di ...
- python中class的总结
思维导图文件:https://files-cdn.cnblogs.com/files/benjieming/class%E6%9C%BA%E5%88%B6.zip
- JavaScript AJAX PHP
AJAX PHP示例 AJAX用于创建更多交互式应用程序. 以下示例演示了当用户在输入字段中键入字符时,网页如何与Web服务器通信: <!DOCTYPE html> <html> ...
- Java中的参数验证(非Spring版)
1. Java中的参数验证(非Spring版) 1.1. 前言 为什么我总遇到这种非正常问题,我们知道很多时候我们的参数校验都是放在controller层的传入参数进行校验,我们常用的校验方式就是引入 ...
- 用构造函数创建对象时,new的行为
用构造函数创建对象: var obj=new 类型名(属性值,…) new: 4件事: 1. 创建一个空对象 2. 让新的子对象继承构造函数的原型对象设置(自动设置新对象的__proto__属性指向构 ...