机蒜客练习题:蒜头君倒水
题目
样例
思路
转移矩阵:
计算公式:
代码
#include<iostream>
using namespace std;
struct matrix
{
double a[100][100];
};
matrix matrix_mul(matrix A, matrix B)
{
matrix C;
for (int i = 0; i < 2; ++i)
{
for (int j = 0; j <2; ++j)
{
C.a[i][j] = 0;
for (int k=0;k<2;++k)
{
C.a[i][j]+=A.a[i][k]*B.a[k][j];
C.a[i][j];
}
}
}
return C;
}
matrix unit() {
// 返回一个单位矩阵
matrix res;
for (int i = 0; i < 2; ++i) {
for (int j = 0; j < 2; ++j) {
if (i == j) {
res.a[i][j] = 1;
} else {
res.a[i][j] = 0;
}
}
}
return res;
}
matrix matrix_pow(matrix A, int i)
{
matrix res = unit(), temp = A;
for (; i; i /= 2)
{
if (i & 1)
{
res = matrix_mul(res, temp);
}
temp = matrix_mul(temp, temp);
}
return res;
}
int main()
{
double a,b,x,y;
int k;
cin>>a>>b;
cin>>x>>y;
cin>>k;
matrix f,f0,fff;
f.a[0][0]=a;f.a[0][1]=0;
f.a[1][0]=b;f.a[1][1]=0;
f0.a[0][0]=1.0-x/100;f0.a[0][1]=y/100;
f0.a[1][0]=x/100;f0.a[1][1]=1.0-y/100;
fff=matrix_mul(matrix_pow(f0,k),f);
printf("%.2lf %.2lf",fff.a[0][0],fff.a[1][0]);
return 0;
}