计蒜客习题:蒜头君倒水


问题描述

蒜头君倒了 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<bits/stdc++.h>
#define me(x) memset(x,0,sizeof(x))
using namespace std;
struct ma{
    double a[5][5];
};
ma bit,s,cs;
double a,b,x,y;
int k;
ma mul(ma s1,ma s2)
{
    ma re;
    for(int i=0;i<2;i++)
        for(int j=0;j<2;j++)
        {
            re.a[i][j]=0.0;
            for(int c=0;c<2;c++)
                re.a[i][j]+=(s1.a[i][c]*s2.a[c][j]);
        }
    return re;
}
void ksm()
{
    while(k)
    {
        if(k&1) bit=mul(bit,s);
        s=mul(s,s);
        k>>=1;
    }
}
void init()
{
    me(bit.a);me(s.a);me(cs.a);
    bit.a[0][0]=bit.a[1][1]=1.0;
    s.a[0][0]=1.0-(x/100.0);
    s.a[0][1]=(y/100.0);
    s.a[1][0]=(x/100.0);
    s.a[1][1]=1.0-(y/100.0); 
    cs.a[0][0]=a;
    cs.a[1][0]=b;
}
int main()
{
    cin>>a>>b>>x>>y>>k;
    init();
    ksm();
    bit=mul(bit,cs);
    printf("%.2lf %.2lf",bit.a[0][0],bit.a[1][0]);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/liukairui/article/details/80032882