蒜头君倒水(矩阵快速幂)

问题描述

蒜头君倒了 2 杯热水在杯子里面,第一杯里面有 a 毫升,第二杯里面有 b 毫升。水太热了,蒜头君决定通过轮流倒水的方式来让水冷下来。

每次倒水蒜头君把第一杯的 x%的水倒入第二杯,把第二杯的 y% 的水倒入第一杯(蒜头君有奇特的方法,能让这一过程是同是发生的,没有先后之分)。

蒜头君一直重复倒水,求倒了 k 次以后 2个杯子的水的容量。

输入格式

第 1 行输入 2 个正整数 a,b(0≤a,b≤108)
第 2 行输入 2 个正整数 x,y(0≤x,y≤100),
第 3 行输入一个整数 k(1≤k≤109)

输出格式

输入 2 个浮点数,用空格隔开,分表表示第一杯水和第二杯水的容量(毫升),输出结果误差在10−2以内都可以接受。

样例输入

10 10
50 50
10000

样例输出

10.00 10.00

同时倒水隐含可以用矩阵快速幂,先写出表达式

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long LL;
 4 
 5 struct matrix
 6 {
 7     double a[105][105];
 8 };
 9 matrix matrix_mul(matrix A, matrix B)//矩阵A乘B 
10 {
11     matrix C;
12     int i,j,k;
13     for(i=0;i<=1;i++)
14     {
15         for(j=0;j<=1;j++)
16         {
17             C.a[i][j]=0;
18             for(k=0;k<=1;k++)
19             {
20                 C.a[i][j]+=A.a[i][k]*B.a[k][j];
21             }
22         }
23     }
24     return C;
25 }
26 matrix unit()//单位矩阵 
27 {
28     matrix res;
29     int i,j;
30     for(i=0;i<=1;i++)
31     {
32         for(j=0;j<=1;j++)
33         {
34             if(i==j)
35             res.a[i][j]=1;
36             else
37             res.a[i][j]=0;
38         }
39     }
40     return res;
41 }
42 matrix matrix_pow(matrix A, int n)//矩阵快速幂 
43 {
44     matrix res=unit(),temp=A;
45     for(;n;n/=2)
46     {
47         if(n&1)
48         res=matrix_mul(res,temp);
49         temp=matrix_mul(temp,temp);
50     }
51     return res;
52 }
53 
54 int main()
55 {
56     double a,b,x,y,k;
57     scanf("%lf %lf %lf %lf %lf",&a,&b,&x,&y,&k);
58     matrix A,B,C;
59     //转移矩阵
60     A.a[0][0]=1-x/100; A.a[0][1]=y/100;
61     A.a[1][0]=x/100; A.a[1][1]=1-y/100;
62     B.a[0][0]=a;
63     B.a[1][0]=b;
64     C=matrix_mul(matrix_pow(A,k), B);
65     printf("%.2lf %.2lf\n",C.a[0][0], C.a[1][0]);
66     return 0;
67 }

-

猜你喜欢

转载自www.cnblogs.com/jiamian/p/12227762.html