给出v, k,请你找到最小的正整数n,满足:
n的二进制表示下存在一个长度为v的回文串,该回文串首尾都是1且n的二进制表示中至少有k个1。保证v,k均为偶数!
由于n可能很大,你只需要输出对取模的结果。
输入描述:
两个整数v, k。保证v,k均为偶数!
输出描述:
一个整数,表示n对取模的结果。
ac:
#include<bits/stdc++.h>
#define ll long long
#define maxn 1000007
using namespace std;
int n[maxn];
const ll mod=1e9+7;
ll qpow(ll a,ll b)
{
ll ans=1;
while(b)
{
if(b&1) ans=(ans*a)%mod;
a=(a*a)%mod;
b/=2;
}
return ans;
}
int main()
{
int v,k;
cin>>v>>k;
if(v<k)
v=k;
n[0]=1;
for(int i=1;i<v/2;i++)
{
if(i>=v/2-(k-2)/2)
n[i]=1;
else n[i]=0;
}
for(int i=v/2;i<v-1;i++)
{
if(i-v/2<(k-2)/2)
n[i]=1;
else n[i]=0;
}
n[v-1]=1;
ll ans=0;
for(int i=v-1;i>=0;i--)
{
if(n[i]==1)
ans=(ans+qpow(2,v-1-i))%mod;
}
cout<<ans<<endl;
return 0;
}