zoukankan      html  css  js  c++  java
  • 蒜头君倒水(矩阵快速幂)

    问题描述

    蒜头君倒了 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 }

    -

  • 相关阅读:
    2019年面试题1
    面试题
    vsftp多个用户公享同一个文件,但是权限不同
    centos7搭建ftp
    安装v2ra y
    centos7安装lamp
    日升昌面试题
    一些插件
    面试被怼集(字节跳动篇)
    TOMCAT原理详解及请求过程(转载)
  • 原文地址:https://www.cnblogs.com/jiamian/p/12227762.html
Copyright © 2011-2022 走看看