题目链接:http://www.bnuoj.com/bnuoj/problem_show.php?pid=29139
题意:如下图,一个n*m的矩阵放满了大蒜。每个大蒜被僵尸咬K口后会消失。每咬一口大蒜,等价于该列的大蒜都被咬了一口。现在只有一个僵尸,初始时在第S行。已知对于2<=i<=n-1行的大蒜咬一口后僵尸换到相邻行的概率均为0.5,第1行只能换到第2行概率为1,第n行换到n-1行,概率为1.问最后僵尸死在第i行的概率?
思路:一共需要咬K*m口。构造出转移的概率矩阵A,求A^(m*K)即可。
int n,m,K,S;
class Matrix
{
public:
double a[130][130];
Matrix operator*(Matrix p)
{
int i,j,k;
double temp;
Matrix ans;
FOR1(i,n) FOR1(j,n)
{
temp=0;
FOR1(k,n) temp+=a[i][k]*p.a[k][j];
ans.a[i][j]=temp;
}
return ans;
}
};
Matrix a,b;
int main()
{
rush()
{
RD(n,m); RD(K,S);
if(n==1)
{
puts("1.0000");
continue;
}
int i;
clr(a.a,0);
FOR1(i,n)
{
if(i==1) a.a[i][2]=1;
else if(i==n) a.a[i][n-1]=1;
else a.a[i][i-1]=a.a[i][i+1]=0.5;
}
clr(b.a,0);
FOR1(i,n) b.a[i][i]=1;
m=m*K;
while(m)
{
if(m&1) b=b*a;
a=a*a;
m>>=1;
}
FOR1(i,n-1) printf("%.4lf ",b.a[S][i]);
printf("%.4lf\n",b.a[S][i]);
}
return 0;
}