这个题目看网上好多题解都是直接O(n*m)卡过。我是这么做的。

对于m次操作,统计每个w的次数。然后对每个w做矩阵乘法。

这样直接做矩阵乘法是会TLE的。

又由于这里的矩阵很特殊,一次乘法可以降维成O(n^2)。

--------------------------

怎么降维的可以这样模拟下:

a b c      a b c     a*a+2bc  c*c+2ab   b*b+2ac

c a b  *  c a b =  b*b+2ac  a*a+2bc  c*c+2ab

b c a      b c a     c*c+2ab  b*b+2ac  a*a+2bc

注意到原矩阵的每一行(除了第一行)都是上一行向右平移一个单位的结果,而相乘得到的矩阵也满足这个性质。

那么做一次矩阵乘法的时候,就只用算出结果矩阵的第一行,然后下面的每一行直接可由上一行得到。

复杂度降为了O(n^2)。

-------------------------

所以一个总的复杂度<O(n^2 * log1000000 * 100)=8千万.

不到2000msAC了^_^

 #include<cstdio>
#include<iostream>
#include<iomanip>
#include<cstring>
#include<cmath>
#include<set>
#include<map>
#include<queue>
#include<stack>
#include<string>
#include<vector>
#include<ctype.h>
#include<algorithm>
using namespace std;
typedef long long LL;
#define FF(i,x) for(i=1;i<=x;i++)
const int N = ; double cMat[N][N],retMat[N][N]; void matrixMul1(double A[][N],double B[][N],int a,int b)
{
double buff[N][N]={};
int i,j,k;
FF(i,a) FF(k,a) FF(j,b)
buff[i][j] = buff[i][j] + A[i][k]*B[k][j];
FF(i,a) FF(j,b) B[i][j]=buff[i][j];
} void matrixMul2(double A[][N],double B[][N],int a,int b)
{
double buff[N][N]={};
for(int j=;j<=a;j++)
{
for(int k=;k<=a;k++)
buff[][j]+=A[][k]*B[k][j];
}
for(int i=;i<=a;i++)
{
for(int j=;j<=a;j++) buff[i][j]=buff[i-][j-];
buff[i][]=buff[i-][a];
}
int i,j;
FF(i,a) FF(j,b) B[i][j]=buff[i][j];
} void matrixFastPow(int p,int n)
{
for(;p;p>>=)
{
if( p& ) matrixMul1(cMat,retMat,n,);
matrixMul2(cMat,cMat,n,n);
}
} int amount[]; int main()
{
int n,m,l,r;
int w; while( scanf("%d%d%d%d",&n,&m,&l,&r),n||m||l||r )
{
memset(amount,,sizeof(amount));
for(int i=;i<m;i++)
{
scanf("%d",&w);
amount[w]++;
}
for(int i=;i<=n;i++)
if( i<l || i>r ) retMat[i][]=0.0;
else retMat[i][]=1.0;
for(int i=;i<=;i++)
if( amount[i] )
{
for(int p=;p<=n;p++)
for(int q=;q<=n;q++)
cMat[p][q]=0.0;
for(int j=;j<=n;j++)
{
int a=(j-i);
while( a<= ) a+=n;
int b=(j+i);
while( b>n ) b-=n;
cMat[j][a]+=0.5;
cMat[j][b]+=0.5;
}
matrixFastPow(amount[i],n);
} printf("%.4f\n",retMat[][]);
}
return ;
}

hdu4576 概率dp n^2的矩阵的更多相关文章

  1. poj 3744 Scout YYF I (矩阵快速幂 优化 概率dp)

    题目链接 分析&&题意来自 : http://www.cnblogs.com/kuangbin/archive/2012/10/02/2710586.html 题意: 在一条不满地雷的 ...

  2. 2018.09.27 bzoj2510: 弱题(概率dp+循环矩阵优化)

    传送门 简单概率dp. 显然每次转移的式子可以用一个矩阵表示出来: 这个是循环矩阵. 因此只用维护第一行快速幂一波就行了. 代码: #include<bits/stdc++.h> #def ...

  3. 【loj2325】「清华集训 2017」小Y和恐怖的奴隶主 概率dp+倍增+矩阵乘法

    题目描述 你有一个m点生命值的奴隶主,奴隶主受伤未死且当前随从数目不超过k则再召唤一个m点生命值的奴隶主. T次询问,每次询问如果如果对面下出一个n点攻击力的克苏恩,你的英雄期望会受到到多少伤害. 输 ...

  4. POJ3744 Scout YYF I 概率DP+矩阵快速幂

    http://poj.org/problem?id=3744 题意:一条路,起点为1,有概率p走一步,概率1-p跳过一格(不走中间格的走两步),有n个点不能走,问到达终点(即最后一个坏点后)不踩坏点的 ...

  5. poj 3744 概率dp+矩阵快速幂

    题意:在一条布满地雷的路上,你现在的起点在1处.在N个点处布有地雷,1<=N<=10.地雷点的坐标范围:[1,100000000]. 每次前进p的概率前进一步,1-p的概率前进1-p步.问 ...

  6. hdu 4576(简单概率dp | 矩阵优化)

    艰难的一道题,体现出菜菜的我... 首先,先吐槽下. 这题到底出题人是怎么想的,用普通概率dp水过??? 那为什么我概率dp写的稍微烂点就一直tle?  感觉很不公平.大家算法都一致,因为我程序没有那 ...

  7. 【bzoj1778】[Usaco2010 Hol]Dotp 驱逐猪猡 矩阵乘法+概率dp+高斯消元

    题目描述 奶牛们建立了一个随机化的臭气炸弹来驱逐猪猡.猪猡的文明包含1到N (2 <= N <= 300)一共N个猪城.这些城市由M (1 <= M <= 44,850)条由两 ...

  8. HDU 5607 graph(矩阵优化+概率DP)

    该题非常easy想到求概率的转移方程:用d[i][j]表示第i步,走到j点的概率. 可是该题的k高达1e9.所以依照套路.要用矩阵相乘来优化. 第一次写矩阵相乘. 大概的意思就是利用矩阵实现递推. 而 ...

  9. poj3744 (概率DP+矩阵快速幂)

    http://poj.org/problem?id=3744 题意:在一条铺满地雷的路上,你现在的起点在1处.在N个点处布有地雷,1<=N<=10.地雷点的坐标范围:[1,10000000 ...

随机推荐

  1. Leetcode-Read N Characters Given Read4 II

    The API: int read4(char *buf) reads 4 characters at a time from a file. The return value is the actu ...

  2. Query classification; understanding user intent

    http://vervedevelopments.com/Blog/query-classification-understanding-user-intent.html What exactly i ...

  3. QT for android 比较完美解决 全屏问题

    项目用到QT qml,需要在android下面全屏显示,折腾了一晚上,搞定,分享下,希望能帮助他人. 参考 Qt on Android:让 Qt Widgets 和 Qt Quick 应用全屏显示 该 ...

  4. 【技术贴】解决bug mantisbt APPLICATION ERROR #1502 没有找到类别

    解决bug mantisAPPLICATION ERROR #1502 没有找到类别 mantisbt出现1502问题解决:引起问题的原因:当提交的问题有分类,此时删除此分类,就会出现下面的情况.问题 ...

  5. select count的优化

    select count的优化 2011-08-02 12:01:36 分类: Oracle 一般情况下,select count语句很难避免走全表扫描,对于上百万行的表这个语句使用起来就比较吃力了, ...

  6. PHP 打印函数之 print print_r

    print 说明 int print ( string $arg ) 输出 arg print 实际上不是一个函数(它是一个语言结构),因此你可以不必使用圆括号来括起它的参数列表 参数 arg:输入数 ...

  7. 【C++之STL】理解容器(ing)

    “容器可容纳一些数据的模板类” “容器是包容其他对象的对象” 两种类型:顺序容器.关联容器   顺序容器 关联容器 访问成员 顺序访问和随机访问 经过优化关键键值访问                 ...

  8. CentOS下使用cmake编译安装mysql

    一.下载安装所必需的依赖包 1.因为高版本mysql都用cmake安装,所以下载cmake wget http://www.cmake.org/files/v3.0/cmake-3.0.1.tar.g ...

  9. Restore IP Addresses

    Given a string containing only digits, restore it by returning all possible valid IP address combina ...

  10. POJ 1026 Cipher(置换群)

    题目链接 题意 :由n个数字组成的密钥,每个数字都不相同,都在1-n之间,有一份长度小于等于n的信息,要求将信息放到密钥下边,一一对应,信息不足n的时候补空格,然后将位置重新排列,将此过程重复k次,求 ...