牛客练习赛32 Phrase String(签到题)
链接:https://ac.nowcoder.com/acm/contest/272/A
来源:牛客网
题解:wa了一发,a*=2的时候忘了mod
一种情况是k<v:
把二进制放一个数组里,按照最优处理数组信息(初始化全为0,跟题上的二级制显示恰好相反,从数组下标1开始,对称更改数组元素为1,这样能使n最小),完了二级制转换成十进制。
另一种是 k>=v:
数组全是1,直接二进制转换十进制即可。
具体看代码,qwq
ac代码
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll mod=1e9+7;
const ll maxn=1e5+5;
ll s[maxn];
int main(){
ll v,k;
cin>>v>>k;
if(k>=v){
ll ans=0;
ll a=1;
while(k--){
ans+=a;
ans%=mod;
a=a*2%mod;
}
cout<<ans<<endl;
}
else{
ll ans=0;
ll temp=v-k;
ll cnt=temp/2;
ll i=1;
ll tp=v;
while(cnt--){
s[i]=1;
s[tp-1-i]=1;
i++;
}
ll a=1;
for(ll i=v-1;i>=0;i--){
if(!s[i]){
ans+=a;
ans%=mod;
}
a=a*2%mod;
}
cout<<ans<<endl;
}
return 0;
}
题目描述
给出v, k,请你找到最小的正整数n,满足:
n的二进制表示下存在一个长度为v的回文串,该回文串首尾都是1且n的二进制表示中至少有k个1。保证v,k均为偶数!
由于n可能很大,你只需要输出对取模的结果。
输入描述:
两个整数v, k。保证v,k均为偶数!
输出描述:
一个整数,表示n对取模的结果。
示例1
输入
6 4
输出
45
说明
样例的构造方法为:101101
示例2
输入
2 4
输出
15
说明
最优的构造方法为:1111
备注:
。