预处理 Gym - 101128H
2024-10-12 21:24:38
题目链接:http://codeforces.com/gym/101128
题目大意:给你一个区间[x,y],找出这个区间有多少个seldom的数字。
seldom的数字定义如下:该数值的二进制数字符合如下条件ABAB...ABAB 或者 ABABA....BA,其中A表示连续的1的个数,B表示连续的0的个数。
思路:因为长度只有63,本来以为是数位dp的,想了想直接暴力预处理就好了
//看看会不会爆int!数组会不会少了一维!
//取物问题一定要小心先手胜利的条件
#include <bits/stdc++.h>
using namespace std;
#pragma comment(linker,"/STACK:102400000,102400000")
#define LL long long
#define ALL(a) a.begin(), a.end()
#define pb push_back
#define mk make_pair
#define fi first
#define se second
#define haha printf("haha\n")
LL x, y;
vector<LL> ve; void solve(LL tmp, LL tmp1, LL i, LL j, int len){
int cnt = ;
while (true){
if (cnt % == ){
cnt++;
if (len + i > ) break;
len += i;
tmp = tmp << i; tmp += tmp1;
ve.pb(tmp);
}
else {
cnt++;
if (len + j > ) break;
len += j;
tmp = tmp << j;
ve.pb(tmp);
}
//printf("tmp = %lld\n", tmp);
}
} void init(){
for (int i = ; i <= ; i++){///这个是1的东西
LL tmp1 = ;
for (int f = ; f < i; f++){
tmp1 |= (1LL << f);
}
ve.pb(tmp1);
for (int j = ; j <= ; j++){///这个是0的东西
if (i + j > ) break;
LL tmp = tmp1 << j;
ve.pb(tmp);
solve(tmp, tmp1, i, j, i + j);
}
}
sort(ALL(ve));
} int main(){
init();
while (scanf("%lld%lld", &x, &y) == ){
int lb = lower_bound(ve.begin(), ve.end(), x) - ve.begin();
int rb = upper_bound(ve.begin(), ve.end(), y) - ve.begin();
printf("%d\n", rb - lb);
}
return ;
}
最新文章
- 常用 Java 静态代码分析工具的分析与比较
- kibana去掉丑陋的basic验证框,用自定义验证代替。
- 用Windows Server 2003搭建企业内部邮件服务器
- 如何将你的程序打包成ipa
- css 实现进度条
- 【opengl】OpenGL中三维物体显示在二维屏幕上显示的变换过程
- oracle 使用技巧
- centos7下编译安装mysql
- Linux CentOS 7 防火墙/端口设置
- oracle11G r2 静默安装单实例(待优化版)
- Redis 实践1- redis介绍和安装
- Linux-文件管理
- LEDAPS1.3.0版本移植到windows平台----HuPm参数初始化模块
- iptables命令提取总结,包含扩展模块<;取自朱双印博客>;
- celery任务进程关闭
- 如何判断是否为同一个App,Ionic3如何修改包名
- article2pdf (Wordpress plug-in) Multiple vulnerabilities(CVE-2019-1000031, CVE-2019-1010257)
- pythonのsqlalchemy简单查询
- IE浏览器中overflow:hidden无效,内层元素超出外层div的解决方法
- 为anaconda的jupyter notebook设置初始化目录