poj 3744 特征方程+快速幂
2015-07-18 16:57
465 查看
容易得到:dp
= dp[n - 1] * p + dp[n - 2] * ( 1 - p ); (1)
如果在位置i有雷的话,则:dp[i + 1] = dp[i - 1] * ( 1 - p );
如何求得dp[i]呢?
我们可以解特征方程(1),得到:
dp
= a * ( p - 1 ) ^ ( n - 1 ) + b;
求得a和b后,再做快速幂。
我们也可以直接用矩阵快速幂来求得答案。
= dp[n - 1] * p + dp[n - 2] * ( 1 - p ); (1)
如果在位置i有雷的话,则:dp[i + 1] = dp[i - 1] * ( 1 - p );
如何求得dp[i]呢?
我们可以解特征方程(1),得到:
dp
= a * ( p - 1 ) ^ ( n - 1 ) + b;
求得a和b后,再做快速幂。
我们也可以直接用矩阵快速幂来求得答案。
#include <algorithm> #include <iostream> #include <cstring> #include <cstdio> using namespace std; const int N = 11; int mine ; int n; double a, b, p; double quickPow( double d, int m ) { double ans = 1.0, w = d; while ( m ) { if ( m & 1 ) { ans = ans * w; } w = w * w; m = m >> 1; } return ans; } double dp( int n ) { if ( n == 0 ) return 0; return a * quickPow( p - 1, n - 1 ) + b; } int main () { while ( scanf("%d%lf", &n, &p) != EOF ) { a = ( p - 1.0 ) / ( p - 2.0 ); b = 1.0 / ( 2 - p ); for ( int i = 0; i < n; i++ ) { scanf("%d", mine + i); } sort( mine, mine + n ); double ans = 1.0; int cur = 1; for ( int i = 0; i < n; i++ ) { int dis = mine[i] - cur; ans = ans * dp(dis) * ( 1 - p ); cur = mine[i] + 1; } printf("%.7f\n", ans); } return 0; }
相关文章推荐
- CoordinatorLayout与滚动的处理
- Silverlight + WCF错误“The remote server returned an error: NotFound.”的解决方法
- XMLFeedSpider例子
- Servlet文件上传
- 域名解析的记录类型:A/CNAME/MX/NS/TXT/AAAA/SRV/显性URL/隐性URL
- JNIEnv解析
- zoj2850,1016,1021,
- [转]java开发环境搭建
- 工厂模式
- @import url("layout.css"); css 引入 css ------@charset "utf-8";
- SDWebImage 内部运行机制
- 用户环境变量
- Delete Node in a Linked List
- Makefile学习
- C++中的链式操作
- C++中的链式操作
- poj 2549 Sumsets(hash)
- 摘录DirectShow数据,视频采集
- Ajax获取响应内容长度的方法
- leetcode | Pow(x, n)