题目 3330: 蓝桥杯2025年第十六届省赛真题-01 串
时间限制: 2s 内存限制: 192MB 提交: 310 解决: 24
题目描述
给定一个由 0, 1, 2, 3 · · · 的二进制表示拼接而成的长度无限的 01 串。
其前若干位形如 011011100101110111 · · · 。
请求出这个串的前 x 位里有多少个 1 。
输入格式
输入的第一行包含一个正整数 x 。
输出格式
输出一行包含一个整数表示答案。
样例输入复制
7
样例输出复制
5
提示
【样例说明】
给定的串的前 7 位为 0110111 。
【评测用例规模与约定】
对于 60% 的评测用例,x ≤ 106 ;
对于所有评测用例,1 ≤ x ≤ 1018 。
1.分析
1个测试点没过,记录一下这种算法。
如果你们能该全过,求告诉!
2.代码
cpp
#include<iostream>
#include<algorithm>
#include<vector>
#include<cmath>
using namespace std;
typedef long long LL;
LL x, re, t=1;
void check(LL i) {
vector<int> v;
while (i) {
v.push_back(i % 2);
i /= 2;
}
for (int i = v.size() - 1; i >= 0&&x>0; i--,x--) {
if (v[i] == 1) re++;
}
}
int main() {
cin >> x;
x--;
while (x >= t * pow(2, t - 1)) {
re += (t - 1) * pow(2, t - 2) + pow(2, t - 1);
x -= t * pow(2, t - 1);
t++;
}
for ( LL i = pow(2, t - 1); x>0; i++) {
check(i);
}
cout << re << endl;
return 0;
}