12 Jellyfish and Green Apple

Jellyfish and Green Apple 数论

image
image
image

将苹果平均的分给人,可以将苹果一分为二,问你最少分多少次。

首先把能分的都分掉就是n%=m,其次操作数是很好想的,就一直*2并且%m,直到n==0,关于这题有难度的就是n,m分不了的情况。

设想一下,成功的情况,也就是这个n一直在乘2最后能==m。那么转换一下就是m/某个苹果数=2的幂次,果数是一直在改变的,也就是只要存在就好。这个数是gcd(n,m)

#include<bits/stdc++.h>
#define int long long
using namespace std;
int lowbit(int x){return x&(-x);}
bool check(int x){
	if(lowbit(x)!=x)return true;
	else return false;
}
void solve(){
	int n,m;
	cin>>n>>m;
	n=n%m;
	if(n==0){
		cout<<0<<"\n";
		return; 
	}
	int x=m/__gcd(n,m);
	if(check(x)){
		cout<<-1<<"\n";
		return;
	}
	int ans=0;
	while(n){
		ans+=n;
		n*=2;
		n%=m;
	} 
	cout<<ans<<"\n"; 
}
signed main(){
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	int t=1;
	cin>>t;
	for(int i=1;i<=t;i++)solve();
	return 0;
} 
posted @ 2024-01-18 20:25  yufan1102  阅读(36)  评论(0编辑  收藏  举报