明明是水题结果没切掉……降智了……

首先令 $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)$。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int maxn=,mod=;
  4. #define FOR(i,a,b) for(int i=(a);i<=(b);i++)
  5. #define ROF(i,a,b) for(int i=(a);i>=(b);i--)
  6. #define MEM(x,v) memset(x,v,sizeof(x))
  7. inline int read(){
  8. char ch=getchar();int x=,f=;
  9. while(ch<'' || ch>'') f|=ch=='-',ch=getchar();
  10. while(ch>='' && ch<='') x=x*+ch-'',ch=getchar();
  11. return f?-x:x;
  12. }
  13. int n,k,a[maxn],c,cnt;
  14. inline int add(int a,int b){return a+b<mod?a+b:a+b-mod;}
  15. inline int sub(int a,int b){return a<b?a-b+mod:a-b;}
  16. inline int mul(int a,int b){return 1ll*a*b%mod;}
  17. inline int qpow(int a,int b){
  18. int ans=;
  19. for(;b;b>>=,a=mul(a,a)) if(b&) ans=mul(ans,a);
  20. return ans;
  21. }
  22. struct matrix{
  23. int a[maxn][maxn];
  24. matrix(){MEM(a,);}
  25. matrix operator*(const matrix &t)const{
  26. matrix ans;
  27. 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]));
  28. return ans;
  29. }
  30. }beg,fac,ans;
  31. matrix qpow(matrix a,int b){
  32. matrix ans;
  33. FOR(i,,c) ans.a[i][i]=;
  34. for(;b;b>>=,a=a*a) if(b&) ans=ans*a;
  35. return ans;
  36. }
  37. int main(){
  38. n=read();k=read();
  39. FOR(i,,n) a[i]=read(),c+=!a[i];
  40. FOR(i,,c) cnt+=!a[i];
  41. beg.a[cnt][]=;
  42. FOR(i,,c){
  43. fac.a[i][i]=(1ll*c*(c-)/+1ll*(n-c)*(n-c-)/+1ll*i*(c-i))%mod;
  44. if(i>=*c-n) fac.a[i][i]=add(fac.a[i][i],mul(c-i,n-*c+i));
  45. if(i) fac.a[i][i-]=mul(c-i+,c-i+);
  46. if(i!=c && i+>=*c-n) fac.a[i][i+]=mul(i+,n-*c+i+);
  47. }
  48. ans=qpow(fac,k)*beg;
  49. int s=;
  50. FOR(i,,c) s=add(s,ans.a[i][]);
  51. s=mul(qpow(s,mod-),ans.a[c][]);
  52. printf("%d\n",s);
  53. }

CF1151F Sonya and Informatics(概率期望,DP,矩阵快速幂)的更多相关文章

  1. 【CF1151F】Sonya and Informatics(动态规划,矩阵快速幂)

    [CF1151F]Sonya and Informatics(动态规划,矩阵快速幂) 题面 CF 题解 考虑一个暴力\(dp\).假设有\(m\)个\(0\),\(n-m\)个\(1\).设\(f[i ...

  2. Codeforces 446D - DZY Loves Games(高斯消元+期望 DP+矩阵快速幂)

    Codeforces 题目传送门 & 洛谷题目传送门 神仙题,%%% 首先考虑所有格子都是陷阱格的情况,那显然就是一个矩阵快速幂,具体来说,设 \(f_{i,j}\) 表示走了 \(i\) 步 ...

  3. CF1151F Sonya and Informatics (计数dp+矩阵优化)

    题目地址 Solution (duyi是我们的红太阳) (这里说一句:这题看上去是一个概率dp,鉴于这题的概率dp写法看上去不好写,我们其实可以写一个计数dp) 首先拿到这个题目我们要能设出一个普通d ...

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

  5. HDU 5434 Peace small elephant 状压dp+矩阵快速幂

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5434 Peace small elephant  Accepts: 38  Submissions: ...

  6. 【BZOJ】2004: [Hnoi2010]Bus 公交线路 状压DP+矩阵快速幂

    [题意]n个点等距排列在长度为n-1的直线上,初始点1~k都有一辆公车,每辆公车都需要一些停靠点,每个点至多只能被一辆公车停靠,且每辆公车相邻两个停靠点的距离至多为p,所有公车最后会停在n-k+1~n ...

  7. 【BZOJ】4861: [Beijing2017]魔法咒语 AC自动机+DP+矩阵快速幂

    [题意]给定n个原串和m个禁忌串,要求用原串集合能拼出的不含禁忌串且长度为L的串的数量.(60%)n,m<=50,L<=100.(40%)原串长度为1或2,L<=10^18. [算法 ...

  8. BZOJ5298 CQOI2018 交错序列 【DP+矩阵快速幂优化】*

    BZOJ5298 CQOI2018 交错序列 [DP+矩阵快速幂优化] Description 我们称一个仅由0.1构成的序列为"交错序列",当且仅当序列中没有相邻的1(可以有相邻 ...

  9. Codeforces 621E Wet Shark and Block【dp + 矩阵快速幂】

    题意: 有b个blocks,每个blocks都有n个相同的0~9的数字,如果从第一个block选1,从第二个block选2,那么就构成12,问对于给定的n,b有多少种构成方案使最后模x的余数为k. 分 ...

  10. codeforces E. Okabe and El Psy Kongroo(dp+矩阵快速幂)

    题目链接:http://codeforces.com/contest/821/problem/E 题意:我们现在位于(0,0)处,目标是走到(K,0)处.每一次我们都可以从(x,y)走到(x+1,y- ...

随机推荐

  1. 迷你版mybatis

    public class BootStrap { public static void start(){ MySqlSession sqlSession = new MySqlSession();// ...

  2. JSP页面的注释细节

    业务场景:通过后台传参,jstl标签控制一个页签是否显示,不过现在要去掉判断,直接让页签显示 在sublime直接这样注释,然后刷新,一直找不到标签显示,其它的都是正常的 <!--<c:i ...

  3. HTML+css基础 css选择器的种类

    css选择器的种类 标签   权重是001 类  class权重是0010 相当于255个标签选择器 Id   权重是0100相当于255个类 *通配符   代表所有的标签   权重是0000 后代选 ...

  4. vue的双向绑定原理浅析与简单实现

    很久之前看过vue的一些原理,对其中的双向绑定原理也有一定程度上的了解,只是最近才在项目上使用vue,这才决定好好了解下vue的实现原理,因此这里对vue的双向绑定原理进行浅析,并做一个简单的实现. ...

  5. Python platform 模块

    Python platform 模块 platform 模块用于查看当前操作系统的信息,来采集系统版本位数计算机类型名称内核等一系列信息. 使用方法: import platform # 获取操作系统 ...

  6. powershell与linux bash对比

    转自Github/Powershell Bash PowerShell Description ls dir, Get-ChildItem List files and folders tree di ...

  7. python中class的总结

    思维导图文件:https://files-cdn.cnblogs.com/files/benjieming/class%E6%9C%BA%E5%88%B6.zip

  8. JavaScript AJAX PHP

    AJAX PHP示例 AJAX用于创建更多交互式应用程序. 以下示例演示了当用户在输入字段中键入字符时,网页如何与Web服务器通信: <!DOCTYPE html> <html> ...

  9. Java中的参数验证(非Spring版)

    1. Java中的参数验证(非Spring版) 1.1. 前言 为什么我总遇到这种非正常问题,我们知道很多时候我们的参数校验都是放在controller层的传入参数进行校验,我们常用的校验方式就是引入 ...

  10. 用构造函数创建对象时,new的行为

    用构造函数创建对象: var obj=new 类型名(属性值,…) new: 4件事: 1. 创建一个空对象 2. 让新的子对象继承构造函数的原型对象设置(自动设置新对象的__proto__属性指向构 ...