问题描述
蒜头君倒了 2 杯热水在杯子里面,第一杯里面有 a 毫升,第二杯里面有 b 毫升。水太热了,蒜头君决定通过轮流倒水的方式来让水冷下来。每次倒水蒜头君把第一杯的 x%的水倒入第二杯,把第二杯的 y% 的水倒入第一杯(蒜头君有奇特的方法,能让这一过程是同是发生的,没有先后之分),蒜头君一直重复倒水,求倒了 k 次以后 2个杯子的水的容量。
输入格式
第 1 行输入 2 个正整数 a,b(0≤a,b≤10^8)
第 2 行输入 2 个正整数 x,y(0≤x,y≤100),
第 3 行输入一个整数 k(1≤k≤10^9)
输出格式
输入 2 个浮点数,用空格隔开,分表表示第一杯水和第二杯水的容量(毫升),输出结果误差在10^−2以内都可以接受。
样例输入
10 10
50 50
10000
样例输出
10.00 10.00
---------------------
解题思路:同时倒水隐含可以用矩阵快速幂,先写出表达式
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll nn=2;
struct matrix{
double a[100][100];
};
matrix matrix_mul(matrix A,matrix B)
{
matrix C;
for(int i=0;i<nn;i++)
{
for(int j=0;j<nn;j++)
{
C.a[i][j]=0;
for(int k=0;k<nn;k++)
{
C.a[i][j]+=A.a[i][k]*B.a[k][j];
}
}
}
return C;
}
matrix unit()
{
matrix res;
for(int i=0;i<nn;i++)
{
for(int j=0;j<nn;j++)
{
if(i==j)
{
res.a[i][j]=1;
}
else
{
res.a[i][j]=0;
}
}
}
return res;
}
matrix pow_matrix(matrix A,ll y)
{
matrix res=unit(),temp=A;
for(;y;y/=2)
{
if(y&1)
{
res=matrix_mul(res,temp);
}
temp=matrix_mul(temp,temp);
}
return res;
}
int main()
{
ll a,b,x,y,k;
scanf("%lld%lld%lld%lld%lld",&a,&b,&x,&y,&k);
/*if(n==1||n==2)
{
cout<<"1"<<endl;
return 0;
}*/
double xx=x*1.0/100,yy=y*1.0/100;
matrix A;
A.a[0][0]=1-xx;
A.a[0][1]=yy;
A.a[1][0]=xx;
A.a[1][1]=1-yy;
matrix B=pow_matrix(A,k);
/*for(int i=0;i<2;i++)
{
for(int j=0;j<2;j++)
{
cout<<B.a[i][j]<<" ";
}
cout<<endl;
}*/
double aa=B.a[0][0]*a+B.a[0][1]*b;
double bb=B.a[1][0]*a+B.a[1][1]*b;
printf("%.2f %.2f\n",aa,bb);
return 0;
}