問題描述
蒜頭君倒了 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
---------------------
解題思路:同時倒水隱含可以用矩陣快速冪,先寫出表示式
#includeusing namespace std;
typedef long long ll;
ll nn=2;
struct matrix;
matrix matrix_mul(matrix a,matrix b)
} }return c;
}matrix unit()
else
}} return res;
}matrix pow_matrix(matrix a,ll y)
temp=matrix_mul(temp,temp);
} return res;
}int main()
*/ double xx=x*1.0/100,yy=y*1.0/100;
matrix a;
a.a[0][0]=1-xx;
a.a[0][1]=yy;
a.a[1][0]=xx;
a.a[1][1]=1-yy;
matrix b=pow_matrix(a,k);
/*for(int i=0;i<2;i++)
cout<}*/
double aa=b.a[0][0]*a+b.a[0][1]*b;
double bb=b.a[1][0]*a+b.a[1][1]*b;
printf("%.2f %.2f\n",aa,bb);
return 0;
}
計蒜客習題 蒜頭君倒水
推出轉移矩陣 1 xyx1 y begin 1 x y x 1 y end 1 xx y1 y 之後的就很顯然了 倒了幾次就是求轉移矩陣的幾次冪 然後乘上原矩陣 ab begin a b end ab 即可 傳送門注意矩陣乘法不滿足交換律 includeusing namespace std dou...
蒜頭君面試 計蒜客
蒜頭君來蒜廠面試的時候,曾經遇到這樣乙個面試題 給定 n nn 個整數,求裡面出現次數最多的數,如果有多個重複出現的數,求出值最大的乙個。當時可算是給蒜頭君難住了。現在蒜頭君來考考你。輸入格式 第一行輸入乙個整數 n 1 n 100000 n 1 le n le 100000 n 1 n 1000 ...
計蒜客 蒜頭君回家
樣例輸入 8 10 p.p t s 樣例輸出 思路用兩次bfs,第一次計算出起點到p的距離,第二次計算出t到p的距離,然後迴圈取最小值。但是wa了很多次,找了很久,發現是vis判斷的問題,導致乙個資料更新多次。ac include include include include using name...