Codeforces1151E,F | 553Div2 | 瞎讲报告
E. Number of Components
- 当时思博了。。一直在想对于\([1,r]\)的联通块和\([1,l-1]\)的联通块推到\([l,r]\)的联通块...我真的是傻了。。这题明明很水啊..换做以前肯定是可以做出来的!(flag*1)
由于是一条链,那么我们考虑就算一个联通块中的最小节点为\(i\)对答案所产生的贡献...不就是满足\(i\)而不满足\(i-1\)的\([l,r]\)区间有多少个吗!(我真的好菜啊!这题明明很水!
F. Sonya and Informatics
神仙吧这题!
一直以为自己是懂矩阵优化DP的。。现在发现自己知道的东西真的只是一点皮毛而已呢!woc。。瞬间不想继续颓废下去了一看这个数据范围\(n \leq 100,k \leq 10^9\)
矩阵乘法!我们先考虑一个肥肠暴力的\(dp\)
再考虑矩阵乘法优化因为如果你要搞出一个非下降的那么一定是\(0\)在前面而\(1\)在后面的
设一共有\(zero\)个\(0\),\(one\)个\(1\)
那么我们就可以设\(dp[i][j]\)表示第\(i\)次操作使得前面\(zero\)个数中有\(j\)个\(0\)的方案数
最后所求即为\[\frac{dp[k][zero]}{(n*(n-1)/2)^{k}}\]
转移应该也还蛮好懂的趴!
\(dp[i][j]\) 可以转移到\(dp[i+1][j-1],dp[i+1][[j],dp[i+1][j+1]\)
那菜鸡博主就举个例子\(dp[i][j] \Rightarrow dp[i+1][j]\) 一步操作,前面\(zero\)里面\(0\)的个数并没有改变,那么一定是下面的请况
- \(1\)与\(1\)交换了 方案数为\(one*(one-1)/2\)
- \(0\)与\(0\)交换了 方案数为\(zero*(zero-1)/2\)
- 前面\(zero\)个数中\(0\)与\(1\)交换了 方案数为\(i*(zero-i)\)
- 后面的数\(0\)与\(1\)交换了 方案数为\((zero-i)*( one-(zero-i) )\)
转移即为
\[dp[i+1][j]=dp[i][j]*(one*(one-1)/2+zero*(zero-1)/2+i*(zero-i)+(zero-i)*(one-(zero-i)))\]
但是这个复杂度是\(O(nk)\)哒 显然过不了嘛
矩阵优化也很容易转换(好吧。对于我这只菜鸡来说并不QwQ.事实上,这题是将转移的系数进行了优化(
不知道这么说对不对。。)好像准确地来说应该是概率
即对于一个矩阵\(A[i][j]\) 表示从前\(zero\)个数中\(0\)的个数由\(i\)变成\(j\)的方案数
我们可以直接预处理出\(A[i][i],A[i][i+1],A[i][i-1]\) 这是转移一次的
转移\(k\)次 即将\(A\)这个矩阵乘个\(k\)遍就行了 矩阵快速幂用一下即可.
贴个代码趴!
#include<bits/stdc++.h>
#define fr(i,x,y) for(int i=x;i<=y;++i)
#define rf(i,x,y) for(int i=x;i>=y;--i)
#define ll long long
using namespace std;
const int N=110,mod=1e9+7;
struct data{
ll a[N][N];
}qx;
ll qwq,inv;
int n,k,b[N];
void Add(ll &x,ll y){
x=(x+y)%mod;
}
void Mul(ll &x,ll y){
x=(x*y)%mod;
}
ll add(ll x,ll y){
return (x+y)%mod;
}
ll mul(ll x,ll y){
return x*y%mod;
}
ll q_pow(ll x,int y){
ll ans=1;
for(;y;y>>=1){
if(y&1) Mul(ans,x);
Mul(x,x);
}
return ans;
}
data cal(data A,data B){
data C;
fr(i,0,n) fr(j,0,n){
C.a[i][j]=0;
fr(k,0,n) Add(C.a[i][j],mul(A.a[i][k],B.a[k][j]));
}
return C;
}
data ksm(data A,int y){
data B;
fr(i,0,n) fr(j,0,n) B.a[i][j]=(i==j);
for(;y;y>>=1){
if(y&1) B=cal(A,B);
A=cal(A,A);
}
return B;
}
ll cal(ll x){
return mul(mul(x,x-1),qwq);
}
int main(){
scanf("%d%d",&n,&k);
qwq=q_pow(2,mod-2),inv=q_pow(q_pow(cal(n),mod-2),k);
int zero=0,one=0;
fr(i,1,n){
scanf("%d",&b[i]);
if(b[i]) one++;
else zero++;
}
int nw=0;
fr(i,1,zero) if(!b[i]) nw++;
data gg;
fr(i,0,zero){
if(n-zero-zero+i<0) continue;
gg.a[i][i]=add(add(add(cal(zero),cal(one)),mul(i,zero-i)),mul(zero-i,one-zero+i));
gg.a[i][i+1]=mul(zero-i,zero-i);
if(i) gg.a[i][i-1]=mul(i,one-zero+i);
}
// fr(i,0,zero) fr(j,0,zero){
// printf("a[%d][%d]=%lld\n",i,j,gg.a[i][j]);
// }
gg=ksm(gg,k);
ll ans=mul(gg.a[nw][zero],inv);
cout<<ans<<endl;
return 0;
}
Codeforces1151E,F | 553Div2 | 瞎讲报告的更多相关文章
- Codeforces1101 | EducationalRound58 | 瞎讲报告
目录 Educational Codeforces Round 58 (Rated for Div. 2) A. Minimum Integer B. Accordion C. Division an ...
- Codeforces70 | Codeforces Beta Round #64 | 瞎讲报告
目录 前言 正文 A B C D E 前言 这个毒瘤的517 放了Div1 然后D题是昨天讲的动态凸包(啊喂!我还没来的及去写 结果自己想的是二分凸包 (当然没有写出来 写完前两题之后就愉快地弃疗 C ...
- AtCoder | ARC103 | 瞎讲报告
目录 ARC 103 A.//// B.Robot Arms C.Tr/ee D.Distance Sums ARC 103 窝是传送门QwQ A.//// 题意 : 给你\(n\)(\(n\)为偶数 ...
- AtCoder | ARC102 | 瞎讲报告
目录 ARC102 前言 正文 传送链接~ ARC102 前言 实在是太菜了....写完第一题就弃疗..感觉T3好歹也是道可做题吧!!然后T2怎么又是进制拆分! 正文 A 题意 给你两个数字\(n,k ...
- Codeforces1084 | Round526Div2 | 瞎讲报告
目录 A. The Fair Nut and Elevator B.Kvass and the Fair Nut C.The Fair Nut and String D.The Fair Nut an ...
- 【瞎讲】 Cayley-Hamilton 常系数齐次线性递推式第n项的快速计算 (m=1e5,n=1e18)
[背诵瞎讲] Cayley-Hamilton 常系数齐次线性递推式第n项的快速计算 (m=1e5,n=1e18) 看CSP看到一题"线性递推式",不会做,去问了问zsy怎么做,他并 ...
- [牛客网练习赛 45 F] Magic Slab 解题报告 (最大权闭合子图)
interlinkage: https://ac.nowcoder.com/acm/contest/847/F description: solution: 最大权闭合子图; 每个单元格看成一个正权点 ...
- [NOIP2018模拟赛10.25]瞎搞报告
闲扯 最近有点颓,都修到好晚,早上起来和吔shi一样难受 忍着困意把题面看完,发现啥也不会,又是一场写暴力的模拟赛 T1发现似乎可以DP,顺手码了个 T2像个最小瓶颈路板子,但是只做过N^2算法的.. ...
- golang代码中生成pprof和trace报告
// 生成 CPU 报告 import ( "context" "runtime/pprof" "log" ) func cpuProfil ...
随机推荐
- [源码分析]ArrayList
add public boolean add(E e) { //先确保数组容量 ensureCapacityInternal(size + 1); //直接将值放在size位置 elementData ...
- VC++获取当前路径及程序名的实现代码
VC上或取当前路径有多种方法,最常用的是使用 GetCurrentDirectory和GetModuleFileName函数,个中都有诸多注意事项,特别总结一下 一.获取当前运行目录的绝对路径 1.使 ...
- Usaco2008 Jan
[Usaco2008 Jan] https://www.luogu.org/problemnew/show/P2419 题目描述 N (1 ≤ N ≤ 100) cows, conveniently ...
- P1437 [HNOI2004]敲砖块
题目描述 在一个凹槽中放置了 n 层砖块.最上面的一层有n 块砖,从上到下每层依次减少一块砖.每块砖 都有一个分值,敲掉这块砖就能得到相应的分值,如下图所示. 14 15 4 3 23 33 33 7 ...
- JQuery Validate插件与实现
菜鸟拙见,望请纠正 一:效果展示:以下是两个注册表单验证,左边使用Jquery validate插件实现,右边是自己用JQuery实现,效果差不多,但个人推荐用插件,毕竟前人栽了树而且长大了后人当然好 ...
- Node学习笔记之模块实现
一.模块分类 由Node提供的模块,称为核心模块:部分核心模块在Node源代码的编译过程中,编译进了二进制执行文件.在node进程启动时,该部分就直接加载进内存,文件定位和编译执行的步骤可以省略掉,并 ...
- Oracle 下马观花看redo
----------------------------------------- --Lerning Content :Oracle 下马观花看redo --Author :如人饮水冷暖自知 --版 ...
- 使用canvas通过js制作一个小型英雄抓怪兽的2D小游戏
首先,这是一个HTML: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...
- 20155325 2017-2018 1 课上测试、课下作业、实验——码云&博客链接汇总 《信息安全系统设计基础》
第二周-课上 码云 https://gitee.com/bestiisjava2017/XinXiAnQuanXiTongSheJiJiChu20155325thl/tree/master/0927 ...
- 20145234黄斐《网络对抗技术》实验八、Web基础
Apache 先通过apachectl start命令开启Apach,使用netstat -aptn命令查看端口占用: 因为端口号80已经被占用(上次实验设置的),所以先修改/etc/apache2/ ...