P17088 轻舟已过 题解

题目大意

给定偶数 \(n\),求最大的正整数 \(x\),使得存在正整数 \(k\),满足以下条件:

  1. \(x\) 小于 \(2^n\)。
  2. \(x\) 的二进制 \(1\) 的个数为 \(k\)。
  3. 最大的能整除 \(x\) 的 \(2\) 的幂为 \(2^k\)。

算法分析

乍一看,第两个条件还蛮简单,其他两个就有点复杂了。其实观察一下样例就能知道第一个条件和 \(x\) 的二进制的位数不超过 \(n\) 等价,而第三个条件和 \(x\) 的二进制末尾的 \(0\) 的个数为 \(k\) 等价。这就好写了,根据贪心策略只要前 \(\frac{n}{2}\) 位是 \(1\),而后 \(\frac{n}{2}\) 位是 \(0\) 就行了。

#include<bits/stdc++.h>
using namespace std;
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    int n;
    cin>>n;
    n>>=1;
    long long ans=1;
    for(int i=1;i<n;i++){
        ans=(ans<<1)|1;//在后面添一个1
    }
    for(int i=1;i<=n;i++){
        ans<<=1;//在后面添一个0
    }
    cout<<ans;
    return 0;
}
posted @ 2026-10-17 18:55  SCX2014  阅读(3)  评论(0)    收藏  举报