题意:
给定v,k 构造一个长度为v的二进制数(二进制的形式),至少包含k个1,并且是回文的,要求值尽量小
思路:
首先是回文的,所以只考虑一半就行了
还有开头必须是1,所以左边一部分的1尽量往后(→)放;
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod = 1e9 + 7;
vector<int> ans;
int main() {
int v, k;
scanf("%d%d", &v, &k);
v /= 2; k /= 2;
ans.push_back(1); k--;
for(int i = 2; i <= v; ++i) {
if(i+k <= v) {
ans.push_back(0);
}
else {
k--;
ans.push_back(1);
}
}
while(k > 0) {
ans.push_back(1);
k--;
}
ll anss = 0;
for(int i = 0; i < ans.size(); ++i) {
anss = (anss * 2LL + ans[i]) % mod;
}
for(int i = ans.size()-1; i >= 0; --i) {
anss = (anss * 2LL + ans[i]) % mod;
}
cout << anss;
return 0;
}