bzoj2510 弱题 【期望dp+循环矩阵快速幂】
2018-01-05 18:00
316 查看
解题思路:
很容易想到每一轮的dp方程:a[i]=(1−1m)a[i]+1ma[i−1=0?n:i−1]
考虑矩阵快速幂,可以O(n3log2k)求解,但仍会TLE。
注意到转移矩阵是一个循环矩阵,即每一行都是上一行平移一格得到(列也是如此),而循环矩阵的性质有:
若A,B皆为循环矩阵,那么A+B,A∗B都是循环矩阵,且A∗B=B∗A。
所以我们写矩阵乘法时可以只用A的第一行去乘B,再平移得到2~n行,这样一次矩乘就是O(n2)的了。
但由于1000*1000的矩阵太大,会爆栈,所以只记录第一行,其余行要用时计算在第一行中的位置即可。
#include<bits/stdc++.h> using namespace std; int getint() { int i=0,f=1;char c; for(c=getchar();(c!='-')&&(c<'0'||c>'9');c=getchar()); if(c=='-')c=getchar(),f=-1; for(;c>='0'&&c<='9';c=getchar())i=(i<<3)+(i<<1)+c-'0'; return i*f; } const int N=1000; int n,m,k; struct matrix { double a ; friend inline matrix operator * (const matrix &A,const matrix &B) { matrix res; for(int i=0;i<n;i++)res.a[i]=0; for(int j=0;j<n;j++) for(int i=0;i<n;i++) res.a[i]+=A.a[j]*B.a[(i-j+n)%n]; return res; } friend inline matrix Pow(matrix A,int b) { matrix res; res.a[0]=1; for(int i=1;i<n;i++)res.a[i]=0; for(;b;b>>=1,A=A*A)if(b&1)res=res*A; return res; } }A,t; int main() { //freopen("lx.in","r",stdin); n=getint(),m=getint(),k=getint(); for(int i=0;i<n;i++)A.a[i]=getint(); t.a[0]=1-1.0/m,t.a[1]=1.0/m; A=A*Pow(t,k); for(int i=0;i<n;i++)printf("%0.3f\n",A.a[i]); return 0; }
相关文章推荐
- bzoj[2510] 弱题(矩阵快速幂+dp)
- BZOJ 2553: [BeiJing2011]禁忌(AC自动机+期望DP+矩阵快速幂)
- 【bzoj】3329: Xorequ 【DP】【快速幂&&矩阵乘法】
- [矩阵快速幂 DP] BZOJ 4037 [HAOI2015]数字串拆分 & BZOJ 2323 [ZJOI2011]细胞
- bzoj 2510: 弱题 概率期望dp+循环矩阵
- 【BZOJ2510】弱题 期望DP+循环矩阵乘法
- [BZOJ 2004][HNOI 2010]Bus 公交线路(矩阵快速幂加速DP)
- bzoj 4000 矩阵快速幂优化DP
- [DP 矩阵快速幂] BZOJ 1875 [SDOI2009]HH去散步
- BZOJ1009 单模板自动机 矩阵快速幂优化DP
- BZOJ 2510: 弱题( 矩阵快速幂 )
- [KMP DP 矩阵快速幂加速] BZOJ 1009 [HNOI2008]GT考试
- [AC自动机 矩阵快速幂 期望] BZOJ 2553 [BeiJing2011]禁忌
- BZOJ1009: [HNOI2008]GT考试 矩阵快速幂+kmp+dp
- bzoj 4036: [HAOI2015]按位或 快速莫比乌斯变换+期望dp
- bzoj 2510: 弱题 期望dp+循环矩阵乘法
- [bzoj 1009] [HNOI2008]GT考试:DP,单串AC自动机,矩阵快速幂
- BZOJ 1009 KMP,DP,矩阵快速幂
- POJ3744 Scout YYF I ( 矩阵快速幂 + 期望概率DP )
- BZOJ 4417: [Shoi2013]超级跳马【矩阵快速幂优化dp