【链接】 我是链接,点我呀:)
【题意】
【题解】
第一个人攻击一次需要1/x秒 第二个人攻击一次需要1/y秒 这两个数字显然都是小数。 我们可以二分最后用了多少时间来攻击。 显然这个是有单调性的,攻击时间越多的话,攻击的次数也就越多。 假设二分出来攻击的时间是mid 那么攻击的次数就是 mid/(1/x) + mid/(1/y) 但是这样显然二分出来的也是一个小数。 我们完全没有办法根据二分出来的东西判断它到底是谁的倍数。 因此我们可以这样。 我们把第一个人攻击一次和第二个人攻击一次所需要的时间都乘上一个x*y 也就是说我们把秒这个单位换成了自己的一个单位t,而且t = x*y*秒 这样的话, 第一个人攻击一次需要的时间就是y t 第二个人攻击一次需要的时间就是x t 然后我们二分最后需要多少t的时间才够攻击a[i]次。 显然如果二分到mid了 那么攻击次数就是mid/y + mid/x (如果不够整除的话,显然就已经不够敲一次了,所以向下取整就ok了) 然后根据最后二分出来的t值,如果同时是x和y的倍数的话,就是both,否则根据%x和%y的结果的出来最后一次是谁敲的就好了。 (这样涉及到的运算就都是整数的了)【代码】
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e5;
ll n,x,y;
int main(){
ios::sync_with_stdio(0),cin.tie(0);
cin >> n >> x >> y;
while (n--){
ll cnt;
cin >> cnt;
ll l = 1,r = 1e16,temp = -1;
while (l<=r){
ll mid = (l+r)/2;
if (mid/y+mid/x>=cnt){
temp = mid;
r = mid - 1;
}else l = mid + 1;
}
if (temp%y==0 && temp%x==0){
cout<<"Both"<<endl;
}else if (temp%y==0){
cout<<"Vanya"<<endl;
}else {
cout<<"Vova"<<endl;
}
}
return 0;
}