想了一小时没想到,究其原因是对公约数,分数的性质不熟悉,直接贴代码
// Problem: C. Jellyfish and Green Apple
// Contest: Codeforces - Codeforces Round 901 (Div. 2)
// URL: https://codeforces.com/problemset/problem/1875/C
// Memory Limit: 256 MB
// Time Limit: 1000 ms
//
// Powered by CP Editor (https://cpeditor.org)
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<string>
#include<cmath>
using namespace std;
#define endl '\n'
int _;
using ULL=unsigned long long;
#define inf 0x3f3f3f3f
#define int long long
bool find(int x){
for(int i=1;i<=1e9;i*=2){ //查看分母是不是2的倍数,如果是,就可以被拆分
if(i==x) return 1;
}
return 0;
}
void solve(){
int n,m;cin>>n>>m;
if(n%m==0){
cout<<0<<endl;return;
}
int p=__gcd(n,m);//最大公约数,然后分子分母同时除以最大公约数,就是化简后的结果,这时候就可以看是不是0.5诸如此类的形式了
if(!find(m/p)){ //找不到就找不到
cout<<-1<<endl;return;
}
double t= n*1.0 / m - n/m;//砍断 整数不需要被处理,只需要考虑小数部分
int ans=0,i=1,now=1;//i是每一次加的,now是砍出这样的大小需要看几次,可以发现是2的n方-1
double x=0.5;//起始
while(t){
if(t>=x){
t-=x;
ans+=(m/(1/x)) * now;//m是人数 1/x是一个1能给几个人使用 now是砍一个用的刀数
}
x/=2.0;//0.5 0.25 0.125
i*=2;//刀数的累加 1 3 7
now+=i;//
}
cout<<ans<<endl;
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>_;
while(_--){
solve();
}
return 0;
}