博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj 3744 Scout YYF I (矩阵快速幂)
阅读量:4543 次
发布时间:2019-06-08

本文共 1319 字,大约阅读时间需要 4 分钟。

题意:一条路上有n个地雷,告诉你这n个雷的位置,一个人初始在位置1,这个人每次可以走1个单位或者跳2个单位,概率分别为p和1-p,现在要求这个人安全通过这段路的概率

思路:求出安全通过每个雷的概率,再把所有的乘起来即可。要安全通过某个雷(假设在place[i]这个位置),只有从place[i]-1跳两格才能安全通过。这样只要求出place[i-1]+1到place[i]-1的概率再乘上(1-p)就能得到通过第i个雷的概率。

由于数据较大,所以必须用矩阵快速幂。其实这是斐波拉契数列的一个变形:f(i)=f(i-1)*p+f(i-2)*(1-p) ;要快速求出f(i),使用矩阵快速幂即可。

 

#include 
#include
#include
#include
using namespace std;int place[1010] ;double ep[1010] , p ,f1 ,f2;struct Mat{ double mat[10][10] ;};Mat mul(Mat a,Mat b){ Mat ret; for(int i=0;i<2;i++) for(int j=0;j<2;j++) { ret.mat[i][j]=0; for(int k=0;k<2;k++) ret.mat[i][j]+=a.mat[i][k]*b.mat[k][j]; } return ret;}Mat pow_M(Mat a,int n){ Mat ret; memset(ret.mat,0,sizeof(ret.mat)); for(int i=0;i<2;i++)ret.mat[i][i]=1; Mat temp=a; while(n) { if(n&1)ret=mul(ret,temp); temp=mul(temp,temp); n>>=1; } return ret;}double Q_mul(int k){ Mat a; a.mat[0][0]=p, a.mat[0][1]=1.0-p ,a.mat[1][0]=1.0 ,a.mat[1][1]=0; Mat ret=pow_M(a,k); return (f2*ret.mat[1][0]+f1*ret.mat[1][1])*(1.0-p);}int main(){ int n; while(cin>>n>>p){ memset(place,0,sizeof(place)) ; for(int i=0;i

 

转载于:https://www.cnblogs.com/Scale-the-heights/p/4702990.html

你可能感兴趣的文章
SPA单页面应用router实现
查看>>
第三周学习进度条
查看>>
Java程序的连贯性
查看>>
上传文件和AJAX验证
查看>>
Java 多线程编程
查看>>
ArcGIS Engine的安装
查看>>
shell入门基础必备
查看>>
在VS2010下运行Qt程序
查看>>
80x86的硬件基础知识摘要
查看>>
algorithm
查看>>
python实例一
查看>>
python小实例——tkinter实战(计算器)
查看>>
素数筛法
查看>>
不等式恒成立求字母范围
查看>>
队列、环形队列(用数组实现)
查看>>
Educational Codeforces Round 37 (Rated for Div. 2) ABC
查看>>
本来想偷懒的今天,想了想,还是写一篇吧,前端登录界面,用的BOOTSTRAP
查看>>
cordova 安装使用
查看>>
*.app 无法打开或已损坏解决办法
查看>>
kali linux之手动漏洞挖掘一
查看>>