给一个长度为 n(n≤100)n (n\leq 100)n(n≤100) 的 0/10/10/1 串,进行 k(k≤109)k (k \leq 10^9)k(k≤109) 次操作,每次操作选择两个位置 i,j(1≤i<j≤n)i,j (1 \leq i < j \leq n)i,j(1≤i<j≤n),交换 i,ji,ji,j 上的数,求 kkk 次操作后,该 0/10/10/1 串变成非降序列的概率,答案对 109+710^9+7109+7 取模。

sol

好题,概率 dp

设有 mmm 个 000,那么题意就是让 a[1,m]a[1,m]a[1,m] 均为 000,a[m+1,n]a[m+1,n]a[m+1,n] 均为 111。

令 fi,jf_{i,j}fi,j​ 表示 iii 个操作后,前 mmm 个数中有 jjj 个 000 的方案数,答案即为 fk,m∑i=0mfk,i\frac{f_{k,m}}{\sum\limits_{i=0}^{m}f_{k,i}}i=0∑m​fk,i​fk,m​​,边界:f0,p=1f_{0,p}=1f0,p​=1,ppp 为原序列前 mmm 个数中 000 的个数。

对于 fi,jf_{i,j}fi,j​,考虑它是如何转移来的:

  • 之前有 j−1j-1j−1 个 000,第 iii 次交换换来一个 000,由于前面 111 的个数与后面 000 的个数均为 m−j+1m-j+1m−j+1,顾方案数为 fi−1,j−1×(m−j+1)2f_{i-1,j-1}\times (m-j+1)^2fi−1,j−1​×(m−j+1)2。
  • 之前有 j+1j + 1j+1 个 000,第 iii 次交换换走一个 000,由于前面有 j+1j+1j+1 个 000,后面有 n−m−(m−j−1)=n−2m+j+1n-m-(m-j-1)=n-2m+j+1n−m−(m−j−1)=n−2m+j+1 个 111,顾方案数为 fi−1,j+1×(j+1)(n−2m+j+1)f_{i-1,j+1}\times (j+1)(n-2m+j+1)fi−1,j+1​×(j+1)(n−2m+j+1)。
  • 之前本来就有 jjj 个 000,第 iii 次操作没换走也没换来,四种情况:前面交换,后面交换,前后交换 000,前后交换 111,则方案数为 Cm2+Cn−m2+j(m−j)+(m−j)(n−2m+j)C_{m}^{2}+C_{n-m}^{2}+j(m-j)+(m-j)(n-2m+j)Cm2​+Cn−m2​+j(m−j)+(m−j)(n−2m+j)。

到这里差点结束了,总结:fi,j=fi−1,j−1×(m−j+1)2+fi−1,j+1×(j+1)(n−2m+j+1)+Cm2+Cn−m2+j(m−j)+(m−j)(n−2m+j)f_{i,j}=f_{i-1,j-1}\times (m-j+1)^2+f_{i-1,j+1}\times (j+1)(n-2m+j+1)+C_{m}^{2}+C_{n-m}^{2}+j(m-j)+(m-j)(n-2m+j)fi,j​=fi−1,j−1​×(m−j+1)2+fi−1,j+1​×(j+1)(n−2m+j+1)+Cm2​+Cn−m2​+j(m−j)+(m−j)(n−2m+j)。

考虑到 k≤109k\leq 10^9k≤109,经验告诉我们直接上矩阵快速幂,毕竟这转移无需判断。
[c0b100⋯0a0c1b20⋯00a1c2b3⋯000a2c3⋯0000a3⋯0⋯⋯⋯⋯⋯⋯0000⋯cm]×[fi−1,0fi−1,1fi−1,2fi−1,3fi−1,4⋯fi−1,m]=[fi,0fi,1fi,2fi,3fi,4⋯fi,m]\begin{bmatrix}c_0& b_1& 0 & 0&\cdots & 0\\ a_0 & c_1 & b_2 & 0&\cdots & 0\\ 0 & a_1 & c_2 & b_3 & \cdots & 0\\ 0&0&a_2&c_3&\cdots&0\\ 0&0&0&a_3&\cdots&0\\ \cdots&\cdots&\cdots&\cdots&\cdots&\cdots\\ 0&0&0&0&\cdots&c_m\end{bmatrix} \times \begin{bmatrix}f_{i-1,0}\\f_{i-1,1}\\f_{i-1,2}\\f_{i-1,3}\\f_{i-1,4}\\ \cdots \\f_{i-1,m}\end{bmatrix}=\begin{bmatrix}f_{i,0}\\f_{i,1}\\f_{i,2}\\f_{i,3}\\f_{i,4}\\ \cdots \\f_{i,m}\end{bmatrix} ⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡​c0​a0​000⋯0​b1​c1​a1​00⋯0​0b2​c2​a2​0⋯0​00b3​c3​a3​⋯0​⋯⋯⋯⋯⋯⋯⋯​00000⋯cm​​⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤​×⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡​fi−1,0​fi−1,1​fi−1,2​fi−1,3​fi−1,4​⋯fi−1,m​​⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤​=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡​fi,0​fi,1​fi,2​fi,3​fi,4​⋯fi,m​​⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤​
其中 ai=(m−i)2a_i=(m-i)^2ai​=(m−i)2,bi=i(n−2m+i)b_i=i(n-2m+i)bi​=i(n−2m+i),ci=Cm2+Cn−m2+i(m−i)+(m−i)(n−2m+i)c_i=C_{m}^{2}+C_{n-m}^{2}+i(m-i)+(m-i)(n-2m+i)ci​=Cm2​+Cn−m2​+i(m−i)+(m−i)(n−2m+i)。

时间复杂度 O(n3log⁡k)\mathcal O(n^3\log k)O(n3logk)。

#include <bits/stdc++.h>using namespace std;#define int long longinline int read() {int x = 0, f = 1;char c = getchar();while (c < '0' || c > '9') {if (c == '-') f = -1;c = getchar();}while (c >= '0' && c <= '9') {x = (x << 3) + (x << 1) + (c ^ 48);c = getchar();}return x * f;
}const int _ = 107, p = 1e9 + 7;int n, k, m, t, Ans, A[_], a[_], b[_], c[_];struct matrix {int a[_][_];void init() {memset(a, 0, sizeof a);}matrix mul(matrix x) {matrix res;res.init();for (int i = 0; i <= m; ++i)for (int j = 0; j <= m; ++j)for (int k = 0; k <= m; ++k)res.a[i][j] = (res.a[i][j] + a[i][k] * x.a[k][j] % p) % p;return res;}
} ans, base;void Qpow(int k) {while (k) {if (k & 1)ans = ans.mul(base);k >>= 1, base = base.mul(base);}
}inline int qpow(int x, int y) {int res = 1;while (y) {if (y & 1)res = res * x % p;y >>= 1, x = x * x % p;}return res;
}signed main() {n = read(), k = read();for (int i = 1; i <= n; ++i) A[i] = read();for (int i = 1; i <= n; ++i) m += (A[i] == 0);for (int i = 1; i <= m; ++i) t += (A[i] == 0);for (int i = 0; i <= m; ++i) {a[i] = (m - i) * (m - i) % p;b[i] = i * (n - 2 * m + i) % p;c[i] = (m * (m - 1) * qpow(2, p - 2) % p + (n - m) * (n - m - 1) * qpow(2, p - 2) % p + (m - i) * (n - 2 * m + 2 * i) % p) % p;}ans.init();for (int i = 0; i <= m; ++i) ans.a[i][i] = 1;base.init();base.a[0][0] = c[0], base.a[0][1] = b[1];base.a[m][m - 1] = a[m - 1], base.a[m][m] = c[m];for (int i = 1; i <= m - 1; ++i) {base.a[i][i - 1] = a[i - 1];base.a[i][i] = c[i];base.a[i][i + 1] = b[i + 1];}Qpow(k);base.init();base.a[t][0] = 1;ans = ans.mul(base);for (int i = 0; i <= m; ++i)Ans = (Ans + ans.a[i][0]) % p;printf("%lld", ans.a[m][0] * qpow(Ans, p - 2) % p);return 0;
}

CF1151F Sonya and Informatics相关推荐

  1. CF1151F - Sonya and Informatics

    1151F - Sonya and Informatics 题意:有个长为n的01序列,求经过K次随机交换两个数之后这个序列非降的概率.n <= 100, k <= 1e9. 解:看到这个 ...

  2. Sonya and Informatics

    https://codeforces.com/contest/1151/problem/F 题意:给定一个01串,每次取出一组(l,r)1≤l<r≤n,交换s[l],s[r],求经过k次之后变成 ...

  3. VIRTUAL COMMUNITY INFORMATICS

    这段时间老师叫我研究下VIRTUAL COMMUNITY INFORMATICS相关的课题,准备写毕业论文.老师说考虑到我开始上班了,时间精力有限,给我个轻松的课题(多体贴的老师啊^_^).不过说实在 ...

  4. ATAC-seq【Harvard FAS Informatics】

    ATAC-seq数据质量评估注意 ENCODE的ATACseq数据标准. Uniform Processing Pipeline Restrictions The read length prior ...

  5. Sonya and Queries CodeForces - 714C

    Today Sonya learned about long integers and invited all her friends to share the fun. Sonya has an i ...

  6. Linux Mint 18.2 Sonya 将于 6 月上旬发布公测版本

    Linux Mint 18.2"Sonya"beta 即将于本月上旬推出,不过还是比原计划的五月发布晚了一些. Mint 团队领导人 Clement Lefebvre 宣布,距离 ...

  7. CF1004F Sonya and Bitwise OR

    CF1004F Sonya and Bitwise OR Solution 感觉比较套路. 序列的前缀ororor有一个性质:最多变换logloglog次. 所以直接建一个线段树,每个区间对于前缀.后 ...

  8. Codeforces Round #371 (Div. 2) C. Sonya and Queries —— 二进制压缩

    题目链接:http://codeforces.com/contest/714/problem/C C. Sonya and Queries time limit per test 1 second m ...

  9. python for informatics_Python for Informatics 第11章 正则表达式一(译)

    注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 目前为止,我们一直在通读文件,查 ...

最新文章

  1. Python中列表的介绍以及常见操作
  2. 【软件工程】软件复用
  3. oracle修改表字段约束条件,Oracle创建表、修改表、删除表、约束条件语法
  4. php有哪些程序结构,PHP常用控制结构
  5. pandas rolling方法_【干货】pandas相关工具包
  6. 我的第一个python web开发框架(6)——第一个Hello World
  7. 输入 3 个正数,判断能否构成一个三角形
  8. phpExcel使用方法二
  9. linux交叉编译jpeg,libjpeg的交叉编译以及jpeg图片的缩放(缩略图)
  10. 线程安全的Singleton模板
  11. JavaScript - 理解面向对象编程
  12. 跟踪AppInfo代码
  13. GhostXP SP3电脑城快速装机新年献礼版 【雪豹】
  14. c语言计时纳秒_C代码中以纳秒为单位计算函数时间
  15. java高级开发面试题
  16. 《PHP基于GD库制作图形验证码》
  17. R语言地理加权回归数据分析
  18. mysql:列类型之时间日期
  19. kali下apt/dpkg 卸载软件
  20. 【会议通知】关于召开第十届全国生物信息学与系统生物学学术大会的重要补充通知(第二轮)...

热门文章

  1. Please don't stop rua 233333
  2. xp 本地计算机策略组,本地组策略-win10没有本地安全策略组怎么打开软件
  3. 基于知识元的外文专利文献知识描述框架
  4. OpenFlow工作机制与流程
  5. http.Request
  6. HttpRequest 和HttpWebRequest的区别(转)
  7. Eclipse一直building workspace: invoking maven project builder卡主
  8. 艾诗菲尔墙布|新品:摩登现代系列《M06-飞马》
  9. java开发 审核流程思路_java 实现一套流程管理、流转的思路(伪工作流) 【仅供参考】...
  10. 深入理解非阻塞同步IO和非阻塞异步IO