【题解】P15632 [2019 KAIST RUN Spring] A Plus Equals B
BpbjsGreen · · 题解
从直观来看,我们当然更想要操作一个数的时候,另一个数不变。题面中符合这种要求的操作只有 A+=A 和 B+=B,这等价于将
首先,
其次,B+=B 使
也就是说,我们多了一种与“A/=2”等价的操作。
于是我们有了一个做法:
while (a != b)
{
// Step 1
while (a % 2 == 0) a /= 2;
while (b % 2 == 0) b /= 2;
// Step 2
if (a < b) b += a;
if (b < a) a += b;
}
第一步将
从直观上来看,砍半的次数还是比较多的,所以操作次数应该不会多于
:::info[操作次数不超过
考察
若 A/=2 或 B/=2 就可以使乘积减少一半。
若
会使 B/=2,乘积就比初始时减少了至少一半。
又因为
回到原题。第
:::
以下是代码。
signed main()
{
scanf("%lld%lld", &a, &b);
while (a != b)
{
while (a % 2 == 0)
s.push_back(4), a >>= 1;
while (b % 2 == 0)
s.push_back(1), b >>= 1;
if (a < b)
s.push_back(3), b += a;
if (b < a)
s.push_back(2), a += b;
}
printf("%lld\n", s.size());
for (auto i : s)
{
if (i == 1)
puts("A+=A");
else if (i == 2)
puts("A+=B");
else if (i == 3)
puts("B+=A");
else
puts("B+=B");
}
return 0;
}