题目链接
Output
For each testcase, if Twilight Sparkle couldn’t make the specific mixture, print a single integer: −1.
Otherwise, print the minimum number of operation 1 to do that.
Example
input
3
3 5 1 1
2 6 1 1
5 7 1 1
output
4
3
-1
题目大意
题目保证:a=b=1
有一个量筒,容积为a+bml,但只有aml的刻度是清晰的
有两个操作:
操作1:向量筒加满纯净水或者魔力水
操作2:将混合水倒出量筒,保留aml在量筒里
问给出x,y,a,b。最少多少次操作1能使两种水的混合比例为x:y
当时思路
先按照操作模拟样例
3:5
1 01 1101 00001101
再模拟2:6
1 01 1101
可发现,取半操作可以看作为压缩,将0/1分别表示为两种水,那么第一次只能执行操作1,即将量筒装满,第二次可以将量筒取半再装一般,按照溶质比来讲就是压缩,原本有多少溶质,加进去的就是多少溶质
eg.第三次操作1后变成1101 这时候量筒里有四份,那么下一次取半,就相当于将这四份压缩到了1ml,但比例不变,再加进去1ml 0/1,就是加进去4份相同的 0/1
按照次规律推算,如果比例x:y ,x+y不是2的幂,肯定配不出来,样例三可以验证!
再发现2:6其实就是1:3,最后一个问题就是怎么算多少次配出来!
当时选择了直接莽
其实答案也已经出来了,既然x+y是2的幂,那么只需要算是多少次方就可以了
题解:
因为a=b=1 所以量筒2ml,刻度为1ml
按照题意可以知道,每次都是取半的操作,所以x+y不是二的幂就直接**-1**
如果是那么就计算x+y是2的几次幂
缘由:既然每操作一次x+y就是不同的2次幂,那么根据样例验算即可得出答案
#include <bits/stdc++.h>
#define int long long
using namespace std;
int gcd(int x,int y){return y==0?x:gcd(y,x%y);}
signed main(void){
int t;cin>>t;
while(t--){
int x,y,a,b;
cin>>x>>y>>a>>b;
int xy=gcd(x,y);
x/=xy;y/=xy;
int flag = 0;
int all=1;
for(int i=2; i<=x+y; i<<=1,all++)
{
if((x+y) == i)
flag = 1;
}
if(flag)
cout<<all<<endl;
else cout<<-1<<endl;
}
return 0;
}