Codeforces Round 901 (Div. 2)

C

题意:

给你n个青苹果要分给m个人,不够分的时候可以平均切一刀,问最少且多少刀可以让每个人得到的苹果一样多

思路:

贪心的想肯定是先把一整个苹果分给大家,这样就不用切了,所以 n = n % m, 多出来的苹果再切完分
最少要切成lcm(n, m)份才能均分,由于每次都只能对半切,所以lcm(n, m) / n一定是\(2^{x}\)个,
平均下来一个人lcm(n, m) / m片,因为每切一刀果子片数+1,那么m个人都有 刀数 * m片

inline void solve() 
{
	int n, m; cin >> n >> m;
	n = n % m;

	if (n == 0)
	{
		cout << 0 << endl;
		return;
	}

	LL lcm = 1LL * n * m / gcd(n, m); // 最少要有lcm片才能均分给m个人
	LL a = lcm / n; // 每个GreenApple应该切成的片数
	LL b = lcm / m; // 每个人应该得到的片数

	if ((a & -a) != a)
	{
		cout << -1 << endl;
		return;
	}

	int cnt = 0;
	while (b)
	{
		b = b - (b & -b);
		cnt++;
	}

	cout << 1LL * cnt * m - n << endl; 

}
posted @ 2024-09-06 21:21  自动机  阅读(11)  评论(0)    收藏  举报