1. 程式人生 > >牛客練習賽32 Phrase String(簽到題)

牛客練習賽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

備註: