P17088 轻舟已过 题解
题目大意
给定偶数 \(n\),求最大的正整数 \(x\),使得存在正整数 \(k\),满足以下条件:
- \(x\) 小于 \(2^n\)。
- \(x\) 的二进制 \(1\) 的个数为 \(k\)。
- 最大的能整除 \(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;
}

浙公网安备 33010602011771号