题解:P12707 [KOI 2021 Round 1] 橡皮擦

· · 题解

好奇一下,这题是怎么黄的。

思路

观察示例,我们发现每次(B)操作其实就是在给每个数的格子号除以 2,根据这个结论,我们不难想到:对于一个正整数 x,对其不断整除,那一次其余数为 1,它就被删掉了。
进一步思考,对于一个正整数 x,我们可以求出它的二进制,从右往左数第一个 1 在第几位,这个数就会在第几轮被删除。
要想使一个数留到最后,这个数的二进制一定要仅有最高位是 1 且位数尽量高。最终,我们得出结论:留到最后的数一定是小于 N2 的最大整数次幂。
理论结束,实践开始!

#include<bits/stdc++.h>
using namespace std;
int main() {
    int n,x;
    cin>>n;
    x=log2(n);//函数的作用:求以2为底,n的对数
    x=1<<x;   //求小于N的2的最大整数次幂
    cout<<x;
}