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;
}

浙公网安备 33010602011771号