您的位置:首页 > 其它

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后,再做快速幂。

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

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: