列表

详情


NC20706. Phrase String

描述

给出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

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 4ms, 内存消耗: 580K, 提交时间: 2020-08-19 10:44:47

#include<bits/stdc++.h>
using namespace std;
const int N=100010,mo=1000000007;
int A[N],v,k,i,Ans=0;
int main(){
	cin>>v>>k;
	v=max(v,k);
	k>>=1;
	k--;
	A[1]=A[v]=1;
	for(i=1;i<=k;i++) A[v/2-i+1]=A[v/2+i]=1;
	for(i=1;i<=v;i++) Ans=(Ans*2+A[i])%mo;
	cout<<Ans;
return 0;
}//

C++11(clang++ 3.9) 解法, 执行用时: 4ms, 内存消耗: 588K, 提交时间: 2020-08-18 20:30:27

#include<bits/stdc++.h>
using namespace std;
const int N=100010,mo=1000000007;
int A[N],v,k,i,Ans=0;
int main(){
	cin>>v>>k;
	v=max(v,k);
	k>>=1;
	k--;
	A[1]=A[v]=1;
	for(i=1;i<=k;i++) A[v/2-i+1]=A[v/2+i]=1;
	for(i=1;i<=v;i++) Ans=(Ans*2+A[i])%mo;
	cout<<Ans;
return 0;
}

pypy3 解法, 执行用时: 155ms, 内存消耗: 25848K, 提交时间: 2022-04-16 10:19:17

v,k = map(int,input().split())
if k<=v:
    v,k=v//2,k//2
    s = '1'+'0'*(v-k)+'1'*(k-1)
    s = '0b'+s+s[::-1]
    n= int(s,2)%(10**9+7)
    print(n)
else:
    s = '0b'+'1'*k
    n= int(s,2)%(10**9+7)
    print(n)

Python3 解法, 执行用时: 42ms, 内存消耗: 4656K, 提交时间: 2022-04-17 18:32:31

v,k = input().split(' ')
v = int(v)
k = int(k)
print(int('1'+'0'*((v-k)//2)+'1'*(k-2)+'0'*((v-k)//2)+'1',2)%1000000007)

上一题