51nod 1836 战忽局的手段
来源:互联网 发布:印度电影票房数据 编辑:程序博客网 时间:2024/05/28 11:48
看了这个题的题解是真心佩服,学到了一招,之前对矩阵快速幂也只是知道,现在明仔了他的用法用在那里,这个题解是真的厉害,推导的完全虐到我这大学生(渣渣),局座果然强,能忽悠。
令f[i][j]为i次忽悠中有j个事件的概率
显然f[i][j]=f[i-1][j]*j/n+f[i-1][j-1]*(n-j+1)/n
令g[i]为i次忽悠之后期望的事件数
我们考虑这个g[i]=(n-1)/n*g[i-1]+1这个递推式,可以矩阵加速
如下
[(n-1)/n , 0]
[g[i],1]*| |=[g[i+1],1]
[g[i],1]*| |=[g[i+1],1]
[ 1 , 1]
#include <bits\stdc++.h>using namespace std;const int MAXN=2;struct Matrix{ __float128 mat[MAXN][MAXN];};Matrix Multi(Matrix a,Matrix b){ Matrix c; for(int i=0;i<MAXN;i++) { for(int j=0;j<MAXN;j++) { c.mat[i][j]=0; for(int k=0;k<MAXN;k++) { c.mat[i][j]+=a.mat[i][k]*b.mat[k][j]; } } } return c;}Matrix Pow(Matrix a,long long m){ Matrix ans; memset(ans.mat,0,sizeof(ans.mat)); ans.mat[0][0]=ans.mat[1][1]=1; while(m){ if(m&1) ans=Multi(ans,a); a=Multi(a,a); m/=2;}return ans;}int main(){ int t; scanf("%d",&t); while(t--) { long long n,m; scanf("%lld%lld",&n,&m); Matrix a; a.mat[0][0]=(__float128)(n-1)/n; a.mat[0][1]=0; a.mat[1][0]=1; a.mat[1][1]=1; Matrix ans=Pow(a,m-1);//中间n-1次相乘 __float128 tmp=ans.mat[0][0]+ans.mat[1][0];//第一次是【1,1】 double res=tmp; printf("%.12f\n",res); } return 0;}
阅读全文
0 0
- 51nod 1836 战忽局的手段
- 51Nod-1836-战忽局的手段
- 51nod 1836 战忽局的手段
- 51nod 1836 战忽局的手段 矩阵乘法
- 51nod 1836 战忽局的手段 (期望)
- 51nod 1836 战忽局的手段(期望+矩阵快速幂)
- 51nod算法马拉松20 C、战忽局的手段
- 51NOD 1836 战忽局的手段(矩阵乘法加速+__float128精度问题+概率期望)——算法马拉松20(告别美国大选及卡斯特罗)
- 【51Nod1836】战忽局的手段
- 幽默的手段(部分)
- 政客的手段
- 管理的手段
- 数据库优化的手段
- 小米的营销手段
- 会话管理的手段
- WebService的开发手段
- 常用的调试手段
- 手段
- 移动端扫描车牌识别开发
- 你可能不知道的JavaScript 遍历DOM的几种方法
- Android 异常报错与解决
- C++读取CSV文件
- MVP的实现
- 51nod 1836 战忽局的手段
- java8
- Makefile学习
- 线性代数之三:向量空间
- 问题 D: 沙漏图形 tri2str [1*+]
- leetcode 216
- 二进制包安装MySQL过程中遇到的一系列错误
- 设计模式梳理(一)
- 数据结构之链表面试题汇总(一)--查找单向链表的中间节点、倒数第K个节点