蒜头君倒水(矩阵快速幂)
Posted jiamian
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了蒜头君倒水(矩阵快速幂)相关的知识,希望对你有一定的参考价值。
问题描述
蒜头君倒了 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 ",C.a[0][0], C.a[1][0]); 66 return 0; 67 }
-
以上是关于蒜头君倒水(矩阵快速幂)的主要内容,如果未能解决你的问题,请参考以下文章