题解归档 - cf535B
本文最后由方少年更新于2026 年 6 月 28 日,已超过0天没有更新。如果文章内容或图片资源失效,请留言反馈,将会及时处理,谢谢!
题解归档 - cf535B
本文由 cf-code 本地题解库自动归档;公开内容以本地 AC/验证版本为准。
- 本地编号:
cf535B - 本地来源:
problems/cf535B/idea.md - 题目链接:https://codeforces.com/contest/535/problem/B
- 原始标题:cf535B — Tavas and SaDDas
思路
cf535B — Tavas and SaDDas
题意
给定仅由 4、7 组成的幸运数 n(1 ≤ n ≤ 10^9),求它在所有幸运数从小到大排序后的 1-based 下标。
做法
把 4 看成二进制 0,7 看成 1,则长度为 L 的幸运数与 L 位二进制一一对应。
- 长度小于
L的幸运数共有2^1 + 2^2 + … + 2^{L-1} = 2^L - 2个。 - 当前串按位转二进制得
v,在同长度中排第v+1。 - 答案:
ans = (2^L - 1) + v,其中v由左到右ans = ans*2 + (c=='7')累加得到。
验证
| 输入 | 答案 |
|---|---|
| 4 | 1 |
| 7 | 2 |
| 77 | 6 |
| 447 | 7 |
| 777777777 | 1022 |
结论
经典二进制映射;O(位数) 实现即可。
代码
来源:problems/cf535B/solution.cpp
/* Author: likely
* Time: 2026-06-08 04:20:31
**/
#include<bits/stdc++.h>
#define ll long long
using namespace std;
string s;
ll i,ans;
int main(){
cin>>s;
ans=0;
for(i=0;i<(ll)s.size();i++){
ans=ans*2;
if(s[i]=='7') ans++;
}
ans+=(1LL<<(ll)s.size())-1;
cout<<ans<<endl;
return 0;
}
~ ~ The End ~ ~
文章标题:题解归档 - cf535B
文章链接:https://www.fangshaonian.cn/archives/357/
最后编辑:2026 年 6 月 28 日 19:07 By 方少年
许可协议: 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)