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

题目描述

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

简要分析

重点:矩阵快速幂

这里和矩阵快速幂求解斐波拉契数列是一样的原理

ac代码

#include<iostream>//矩阵二分快速幂
#include<cstdio>
using namespace std;

struct matrix{//矩阵类型结构体
    double a[2][2];
};
matrix matrix_mul(matrix A,matrix B){//矩阵相乘(A*B=C)
    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];
        }
    }
    return C;
}
matrix unit(){//返回一个2阶单位矩阵
    matrix C;
    for(int i=0;i<2;i++){
        for(int j=0;j<2;j++){
            if(i==j)C.a[i][j]=1;
            else C.a[i][j]=0;
        }
    }
    return C;
}
matrix matrix_pow(matrix A,int k){//矩阵快速幂求解矩阵A的k次方
    matrix res=unit(),temp=A;
    for(;k;k/=2){
        if(k&1)
            res=matrix_mul(res,temp);
        temp=matrix_mul(temp,temp);
    }
    return res;
}

int main()
{
    int a,b,k,x,y;
    scanf("%d%d%d%d%d",&a,&b,&x,&y,&k);
    matrix B,A,mid_res,res;
    B.a[0][0]=a;B.a[0][1]=b;B.a[1][0]=0;B.a[1][1]=0;
    A.a[0][0]=1-x/100.0;A.a[0][1]=x/100.0;
    A.a[1][0]=y/100.0;A.a[1][1]=1-y/100.0;
    mid_res=matrix_pow(A,k);
    res=matrix_mul(B,mid_res);
    printf("%.2lf %.2lf\n",res.a[0][0],res.a[0][1]);
    return 0;//give me five
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值