三十年河东,三十年河西|

自动机

园龄:1年10个月粉丝:2关注:4

Codeforces Round 901 (Div. 2)

C

题意:

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

思路:

贪心的想肯定是先把一整个苹果分给大家,这样就不用切了,所以 n = n % m, 多出来的苹果再切完分
最少要切成lcm(n, m)份才能均分,由于每次都只能对半切,所以lcm(n, m) / n一定是2x个,
平均下来一个人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; 

}

本文作者:自动机

本文链接:https://www.cnblogs.com/monituihuo/articles/17744934.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   自动机  阅读(7)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起