题目大意
做火箭去火星,经过一段路径,问要带多少燃料。
经过的路径为1->2->3->…->n->1(注意不是n->n-1->n-2->…->1)
在第i个星球上,1吨燃料可以起飞ai吨的重量,可以降落bi吨的重量,认为起飞和降落是瞬移,比如10吨的火箭和8吨的燃料共18吨,在bi=6的星球上降落,消耗3吨燃料,降落后质量为15吨
问最少要带多少吨燃料
最少带的燃料当然就是返回1时刚好用完了。。。我们假设起飞(降落)前的【总】重量为x,那么起飞(降落)后剩余的质量为 x−xai x − x a i ( x−xbi x − x b i ),这个质量恰好就是下一次降落(起飞)前的质量,所以设初始质量为x,从第一个星球起飞后的质量为 x(1−1a1) x ( 1 − 1 a 1 ) ,在第二个星球上降落后的质量为 x(1−1a1)(1−1b2) x ( 1 − 1 a 1 ) ( 1 − 1 b 2 ) ,在第二个星球上起飞后的质量为 x(1−1a1)(1−1b2)(1−1a2) x ( 1 − 1 a 1 ) ( 1 − 1 b 2 ) ( 1 − 1 a 2 ) ,以此类推,重新降落到第一个星球,结束行程后的质量为 x(1−1a1)(1−1b2)(1−1a2)...(1−1bn)(1−1an)(1−1b1) x ( 1 − 1 a 1 ) ( 1 − 1 b 2 ) ( 1 − 1 a 2 ) . . . ( 1 − 1 b n ) ( 1 − 1 a n ) ( 1 − 1 b 1 )
要使带的燃料最少,也就是说降落后的质量刚好等于火箭的质量,那么就有
注意上式中的x为初始质量,即火箭+燃料的质量,那么根据这个等式我们就可以得到公式
燃料质量 t=(∏ai∏bi∏ai−1∏bi−1−1)×m t = ( ∏ a i ∏ b i ∏ a i − 1 ∏ b i − 1 − 1 ) × m
显然可以发现如果任意的ai或bi为1,那就无解,这个结论是显然符合条件的。
公式出来了其他也不多说了,上代码
#include<bits/stdc++.h>
#define maxn 1000005
using namespace std;
int a[maxn], b[maxn];
int main() {
bool flag = false;
int n, m; cin>>n>>m;
for(int i = 0; i < n; i++) { cin>>a[i]; if(a[i] <= 1) flag = true; }
for(int i = 0; i < n; i++) { cin>>b[i]; if(b[i] <= 1) flag = true; }
if(flag) printf("-1\n");
else {
double ans = 1;
for(int i = 0; i < n; i++) {
ans = ans * (double) a[i] * (double) b[i] / (double) (a[i]-1) / (double) (b[i]-1);
}
if(ans > 1e9) printf("-1\n");
else printf("%.10lf\n", (ans-1) * m);
}
return 0;
}