寒假集训Day6

Jellyfish and apple

https://www.luogu.com.cn/problem/CF1875C
这道题使用的是贪心
首先 对于多于m的苹果个数,可以直接分给m个人,所以先把n对m取模,然后考虑剩下的苹果
然后考虑不能分的情况
如果求出m和n的最大公约数,把m和n同时除以最大公约数,那么得到的人数应该是2k,否则的话就说明人数中一定是有某个非2的倍数的因子是苹果数没有的,这样的话苹果数不管怎么翻倍都翻不出人数
那么对于剩下的情况,就把苹果数不断地翻倍,去掉够用的苹果就行
这里记这道题主要是想说,去掉够用的苹果的时候直接取模就行了,为什么一开始要那么傻还设一个循环在遍历……

#include <bits/stdc++.h>
using namespace std;
int t = 0;
long long n,m;
long long num = 0;
inline int lowbit(int x){return x&(-x);}
int main () {
	int i = 2;
	scanf("%d" ,&t);
	for(int o = 1;o <= t; o++) {
		scanf("%lld %lld" ,&n,&m);
		if(lowbit(m / __gcd(n,m)) != m / __gcd(n,m)){
			printf("-1\n");
			continue;
		}
		n = n % m;
		while(n != 0) {
			num += n;
			n = n * 2;
			n = n % m;
		}
		printf("%lld\n" ,num);
		num = 0;
	}
	return 0;
}
posted @ 2024-01-24 10:04  24Kmagic  阅读(6)  评论(0)    收藏  举报