牛客练习赛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

备注:

posted @ 2018-11-30 21:57  UUUUh  阅读(208)  评论(0编辑  收藏  举报