codeforces 597div2 F. Daniel and Spring Cleaning(数位dp+二维容斥)
题目链接:https://codeforces.com/contest/1245/problem/F
题意:给定一个区间(L,R),a、b两个数都是属于区间内的数,求满足 a + b = a ^ b 的实数对个数。
题解:看到求区间内满足一定条件的数的个数,应该用数位dp,数位dp基本操作是编写出solve函数调用记忆化搜索,那么考虑solve(R,R)是求0到R满足条件的答案,solve(L-1,R)求a属于0到L-1,b属于0到R满足条件的答案,solve(L-1,L-1)是ab都属于0到L-1满足条件的个数,那么最终的答案 = solve(R,R) - solve(L-1,R) - solve(R,L-1) + solve(L-1,L-1) ,这是一个二维容斥。
a + b = a ^ b又可以转化为a & b = 0,这两者是相互等价的,那么就可以直接数位dp了,因为a&b=0,所以ab每一位相与都是0,依次来进行数位dp的记忆化搜索。
AC代码:
#include<iostream>
#include<cstring>
using namespace std;
typedef long long ll;
const int maxn = 33;
ll dp[maxn][2][2],L[33],R[33];
ll dfs(int pos,int nowa,int nowb){ // nowa,nowb记录是否受上一位所限制
if(pos == 0) return 1;
if( dp[pos][nowa][nowb] != -1) return dp[pos][nowa][nowb];//如果搜索过直接返回
int maxa = nowa?L[pos]:1;//最高位是1
int maxb = nowb?R[pos]:1;//最高位是1
ll res = 0;
for(int i = 0;i<=maxa;i++){
for(int j = 0;j<=maxb;j++){
if((i&j) == 0){//二层循环枚举一个数位的2*2的情况
res += dfs(pos-1,nowa&(i == maxa),nowb&(j == maxb));
}
}
}
dp[pos][nowa][nowb] = res;
return res;
}
ll cal(int l,int r){
if(l<0 || r<0) return 0;
memset(dp,-1,sizeof(dp));
for(int i=1;i<=31;i++)//因为枚举的数是二进制存储,所以要以二进制形式保存
{//数位分离
L[i]=l&1;
R[i]=r&1;
l/=2;
r/=2;
}
return dfs(31,1,1);
}
ll solve(){
int l,r;
scanf("%d%d",&l,&r);
return cal(r,r)-2*cal(l-1,r)+cal(l-1,l-1);//二维容斥
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int t;
scanf("%d",&t);
while(t--){
printf("%lld\n",solve());
}
return 0;
}
codeforces 597div2 F. Daniel and Spring Cleaning(数位dp+二维容斥)的更多相关文章
- Codeforces Round #597 (Div. 2) F. Daniel and Spring Cleaning 数位dp
F. Daniel and Spring Cleaning While doing some spring cleaning, Daniel found an old calculator that ...
- [cf 1245 F] Daniel and Spring Cleaning
题意: 求区间$[l,r]$内有多少有序数对$(a,b)$满足$a+b=a\bigoplus b$. $l,r\leq 10^9$. 题解: 有用的就一句话: 求区间内一元组可以一维容斥,同理求二元组 ...
- Codefroces 1245 F. Daniel and Spring Cleaning
传送门 考虑简单的容斥 设 $F(n,m)$ 表示 $a \in [1,n] , b \in [1,m]$ 的满足 $a+b=a \text{ xor } b$ 的数对的数量 那么答案即为 $F(r, ...
- CF1245F: Daniel and Spring Cleaning
CF1245F: Daniel and Spring Cleaning 题意描述: 给定区间\([L,R]\),其中 \((0\leq L,R\leq 10^9)\),问在区间内有多少数对\((x,y ...
- spring boot高性能实现二维码扫码登录(中)——Redis版
前言 本打算用CountDownLatch来实现,但有个问题我没有考虑,就是当用户APP没有扫二维码的时候,线程会阻塞5分钟,这反而造成性能的下降.好吧,现在回归传统方式:前端ajax每隔1秒或2秒发 ...
- spring boot高性能实现二维码扫码登录(下)——订阅与发布机制版
前言 基于之前两篇(<spring boot高性能实现二维码扫码登录(上)——单服务器版>和<spring boot高性能实现二维码扫码登录(中)——Redis版>)的基础, ...
- CodeForces - 1245F Daniel and Spring Cleaning (数位DP)
While doing some spring cleaning, Daniel found an old calculator that he loves so much. However, it ...
- Codeforces Beta Round #51 D. Beautiful numbers 数位dp
D. Beautiful numbers Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/55/p ...
- Codeforces Gym100623J:Just Too Lucky(数位DP)
http://codeforces.com/gym/100623/attachments 题意:问1到n里面有多少个数满足:本身被其各个数位加起来的和整除.例如120 % 3 == 0,111 % 3 ...
随机推荐
- 每天进步一点点------Modelsim添加Xilinx仿真库的详细步骤
Modelsim,可以选型SE和XE两个版本.Modelsim XE可以直接被ISE调用,而Modelsim SE需要手动添加仿真库.但SE版和OEM版在功能和性能方面有较大差别,比如对于大家都关心的 ...
- windows10 找回windows照片查看器的方法
突然发现windows10自带的图片查看器打开预览查看速度还是可以的,但是却找不到了,,,,, 下面就是如何找回 windows 图片查看器的操作了,只需要运行一个bat程序即可!!!!!! 随便新建 ...
- Linux安装U盘启动报错Failed to load ldlinux.c32
报错信息 使用U盘安装linux无法正常启动 Start booting from USB device... SYSLINUX 5.10 EDD 2013-06-04 Copyright (C) 1 ...
- psp 周计划2
日期\时间 开始时间 结束时间 中断时间 净时间 活动 备注 12/3 9:00 11:30 10:30 120分钟 自习,练习 教室 14:00 16:30 15:30 80分钟 练习 中午休息 1 ...
- mybatis-plus热部署mapper.xml插件JRebel MybatisPlus extension,报错:java.lang.NullPointerException
事件 mybatis转mybatis-plus,结果原来的Jrebel for intrllij 不能热部署mapper.xml文件,百度得知得添加新的插件 JRebel MybatisPlus ex ...
- SVM-支持向量机(一)线性SVM分类
SVM-支持向量机 SVM(Support Vector Machine)-支持向量机,是一个功能非常强大的机器学习模型,可以处理线性与非线性的分类.回归,甚至是异常检测.它也是机器学习中非常热门的算 ...
- 机器学习作业(三)多类别分类与神经网络——Python(numpy)实现
题目太长了!下载地址[传送门] 第1题 简述:识别图片上的数字. import numpy as np import scipy.io as scio import matplotlib.pyplot ...
- Wannafly Camp 2020 Day 6I 你吓到我的马了.jpg - BFS
暴力BFS即可 #include <bits/stdc++.h> using namespace std; int n,m,f[105][105]; char s[105][105]; s ...
- main中的argv和argc
int main(int argc,char* argv[]) 给程序传递命令行参数:第一个参数的值是第二个参数的数组元素个数,即统计运行程序时送给main函数的命令行参数个数. 第二个参数总是cha ...
- 字符串匹配算法--KMP字符串搜索(Knuth–Morris–Pratt string-searching)C语言实现与讲解
一.前言 在计算机科学中,Knuth-Morris-Pratt字符串查找算法(简称为KMP算法)可在一个主文本字符串S内查找一个词W的出现位置.此算法通过运用对这个词在不匹配时本身就包含足够的信息 ...