Codeforces Round #581 (Div. 2) A. BowWow and the Timetable

本文介绍了一个算法问题的解决方案,该问题要求在给定的二进制字符串中,找出其十进制表示下1到n-1之间4的整数次幂的数量。文章提出了一种高效的方法,通过分析二进制数的特性,利用字符串长度和1的个数来快速计算结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接

题目描述:

给一个二进制数字串,设它的十进制表示为 n ,问 1 到 n - 1有多少个 4 的整数次幂

特别傻吊的一个题,模拟进制也可以写,但是模拟进制太low了,换一个思路

首先,如果一个数的二进制是 100000000(开头是1后面全是0)设它是2的k次幂,那么类似于这样的1111111111(全是1)是 2 的 k+1 次幂 - 1

也就是说,它们中的4的整数次幂的个数最多差一个,或者相等

理由:

因为长度一定的二进制数,最多差一倍而已

如果这个数本身是4的整数次幂(即长度是奇数),如果数字串中有多余一个1,那么就可以包含当前的数(10000000这样的),如果后面全是0,则不用 +1 

对于100000这样的如何求4的整数次幂有多少个,直接字符串长度除以2就ok了,因为每隔两位相当于乘以一个4

#include <bits/stdc++.h>
using namespace std;

int main()
{
	string s;
	cin >> s;
	int len = s.length();
	int res = 0;
	int f = 0;
	res = len / 2;
	for (int i = 0; i < len; i++)if(s[i] == '1')++f;
	if(f > 1 && len & 1)++res;
	printf("%d", res);
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值