poj 3744 特征方程+快速幂

容易得到:dp[n] = dp[n - 1] * p + dp[n - 2] * ( 1 - p );  (1)

如果在位置i有雷的话,则:dp[i + 1] = dp[i - 1] * ( 1 - p );

如何求得dp[i]呢?

我们可以解特征方程(1),得到:

  dp[n] = a * ( p - 1 ) ^ ( n - 1 ) + b;

  求得a和b后,再做快速幂。

我们也可以直接用矩阵快速幂来求得答案。

 1 #include <algorithm>
 2 #include <iostream>
 3 #include <cstring>
 4 #include <cstdio>
 5 using namespace std;
 6
 7 const int N = 11;
 8 int mine[N];
 9 int n;
10 double a, b, p;
11
12 double quickPow( double d, int m )
13 {
14     double ans = 1.0, w = d;
15     while ( m )
16     {
17         if ( m & 1 )
18         {
19             ans = ans * w;
20         }
21         w = w * w;
22         m = m >> 1;
23     }
24     return ans;
25 }
26
27 double dp( int n )
28 {
29     if ( n == 0 ) return 0;
30     return a * quickPow( p - 1, n - 1 ) + b;
31 }
32
33 int main ()
34 {
35     while ( scanf("%d%lf", &n, &p) != EOF )
36     {
37         a = ( p - 1.0 ) / ( p - 2.0 );
38         b = 1.0 / ( 2 - p );
39         for ( int i = 0; i < n; i++ )
40         {
41             scanf("%d", mine + i);
42         }
43         sort( mine, mine + n );
44         double ans = 1.0;
45         int cur = 1;
46         for ( int i = 0; i < n; i++ )
47         {
48             int dis = mine[i] - cur;
49             ans = ans * dp(dis) * ( 1 - p );
50             cur = mine[i] + 1;
51         }
52         printf("%.7f\n", ans);
53     }
54     return 0;
55 }
时间: 2024-10-19 20:09:29

poj 3744 特征方程+快速幂的相关文章

POJ 3744:Scout YYF I 概率DP+特征方程+快速幂

Scout YYF I 题目连接: http://poj.org/problem?id=3744 题意: 有个人要到一个叫“mine road”的地方,路线是一条直线,起点在1,路上有N个地雷,坐标在[1, 100000000]之间,这人每次有p(0.25≤p≤0.75)的概率向前走一步,且有1-p的概率向前走两步,问这货安全通过雷区到达"mine road"的概率 题解: 利用特征方程求出通项表达式,要走过有雷的地方f(n+1)=f(n-1)*(1-p).   PS:也可以用矩阵快速

POJ 3070-Fibonacci(矩阵快速幂求斐波那契数列)

Fibonacci Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 3070 Appoint description:  System Crawler  (2015-02-28) Description In the Fibonacci integer sequence, F0 = 0, F1 = 1, and Fn = Fn ? 1 +

poj 3233(矩阵快速幂)

题目链接:http://poj.org/problem?id=3233: 题意:给出一个公式求这个式子模m的解: 分析:本题就是给的矩阵,所以很显然是矩阵快速幂,但有一点,本题k的值非常大,所以要用二分求和来减少运行时间. 代码: #include <set> #include <map> #include <stack> #include <queue> #include <math.h> #include <vector> #in

poj 1995 裸快速幂

1. poj 1995  Raising Modulo Numbers 2.链接:http://poj.org/problem?id=1995 3.总结:今天七夕,来发水题纪念一下...入ACM这个坑也快一年了 题意:求ai^bi和模m.裸快速幂 #include<iostream> #include<cstring> #include<cmath> #include<queue> #include<algorithm> #include<

POJ 1995 (快速幂)

这道题普通做法会发生溢出且会超时,应当用快速幂来求解. 快速幂讲解 1 #include <cstdio> 2 #include <cmath> 3 using namespace std; 4 int main(){ 5 int Z; 6 scanf("%d",&Z); 7 while(Z--){ 8 int M, H; 9 unsigned long long sum = 0; 10 scanf("%d%d",&M,&am

POJ 3070 矩阵快速幂

裸题,最简单fib的应用模板,算是新技能get 吧. 其实和快速幂差不多了,只是矩阵代替的递推式. 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 using namespace std; 5 const int maxn = 1005; 6 struct node 7 { 8 int a[2][2]; 9 void init() 10 { 11 a[0][0] = a[1][0] =

POJ 3070 矩阵快速幂解决fib问题

矩阵快速幂:http://www.cnblogs.com/atmacmer/p/5184736.html 题目链接 #include<iostream> #include<cstdio> using namespace std; typedef long long ll; #define MOD 10000 ll a[7],b[7],a0[7],b0[7]; void pow_mod(ll n) { a0[1]=a0[2]=a0[3]=1,a0[4]=0; b0[1]=b0[4]=

POJ 1845 Sumdiv (快速幂+质因数+约数和公式+同余模)

Sumdiv Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 16109   Accepted: 3992 Description Consider two natural numbers A and B. Let S be the sum of all natural divisors of A^B. Determine S modulo 9901 (the rest of the division of S by 99

Fibonacci (poj 3070 矩阵快速幂)

Language: Default Fibonacci Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10099   Accepted: 7211 Description In the Fibonacci integer sequence, F0 = 0, F1 = 1, and Fn = Fn ? 1 + Fn ? 2 for n ≥ 2. For example, the first ten terms of the