题目链接: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代码:

  1. #include<iostream>
  2. #include<cstring>
  3. using namespace std;
  4. typedef long long ll;
  5. const int maxn = 33;
  6. ll dp[maxn][2][2],L[33],R[33];
  7. ll dfs(int pos,int nowa,int nowb){ // nowa,nowb记录是否受上一位所限制
  8. if(pos == 0) return 1;
  9. if( dp[pos][nowa][nowb] != -1) return dp[pos][nowa][nowb];//如果搜索过直接返回
  10. int maxa = nowa?L[pos]:1;//最高位是1
  11. int maxb = nowb?R[pos]:1;//最高位是1
  12. ll res = 0;
  13. for(int i = 0;i<=maxa;i++){
  14. for(int j = 0;j<=maxb;j++){
  15. if((i&j) == 0){//二层循环枚举一个数位的2*2的情况
  16. res += dfs(pos-1,nowa&(i == maxa),nowb&(j == maxb));
  17. }
  18. }
  19. }
  20. dp[pos][nowa][nowb] = res;
  21. return res;
  22. }
  23. ll cal(int l,int r){
  24. if(l<0 || r<0) return 0;
  25. memset(dp,-1,sizeof(dp));
  26. for(int i=1;i<=31;i++)//因为枚举的数是二进制存储,所以要以二进制形式保存
  27. {//数位分离
  28. L[i]=l&1;
  29. R[i]=r&1;
  30. l/=2;
  31. r/=2;
  32. }
  33. return dfs(31,1,1);
  34. }
  35. ll solve(){
  36. int l,r;
  37. scanf("%d%d",&l,&r);
  38. return cal(r,r)-2*cal(l-1,r)+cal(l-1,l-1);//二维容斥
  39. }
  40. int main(){
  41. ios::sync_with_stdio(false);
  42. cin.tie(0),cout.tie(0);
  43. int t;
  44. scanf("%d",&t);
  45. while(t--){
  46. printf("%lld\n",solve());
  47. }
  48. return 0;
  49. }

codeforces 597div2 F. Daniel and Spring Cleaning(数位dp+二维容斥)的更多相关文章

  1. 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 ...

  2. [cf 1245 F] Daniel and Spring Cleaning

    题意: 求区间$[l,r]$内有多少有序数对$(a,b)$满足$a+b=a\bigoplus b$. $l,r\leq 10^9$. 题解: 有用的就一句话: 求区间内一元组可以一维容斥,同理求二元组 ...

  3. 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, ...

  4. CF1245F: Daniel and Spring Cleaning

    CF1245F: Daniel and Spring Cleaning 题意描述: 给定区间\([L,R]\),其中 \((0\leq L,R\leq 10^9)\),问在区间内有多少数对\((x,y ...

  5. spring boot高性能实现二维码扫码登录(中)——Redis版

    前言 本打算用CountDownLatch来实现,但有个问题我没有考虑,就是当用户APP没有扫二维码的时候,线程会阻塞5分钟,这反而造成性能的下降.好吧,现在回归传统方式:前端ajax每隔1秒或2秒发 ...

  6. spring boot高性能实现二维码扫码登录(下)——订阅与发布机制版

     前言 基于之前两篇(<spring boot高性能实现二维码扫码登录(上)——单服务器版>和<spring boot高性能实现二维码扫码登录(中)——Redis版>)的基础, ...

  7. CodeForces - 1245F Daniel and Spring Cleaning (数位DP)

    While doing some spring cleaning, Daniel found an old calculator that he loves so much. However, it ...

  8. 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 ...

  9. Codeforces Gym100623J:Just Too Lucky(数位DP)

    http://codeforces.com/gym/100623/attachments 题意:问1到n里面有多少个数满足:本身被其各个数位加起来的和整除.例如120 % 3 == 0,111 % 3 ...

随机推荐

  1. ArcMap 导入 CGCS2000 线段数据

    1. 先确定数据的经纬度和X.Y列是否正确, 2. ArcToolBox ---> DataManagement Tools ---> XY to line 3. 选择数据,选择对应起始点 ...

  2. Flask之RESTFul API前后端分离

    Flask之RESTFul API前后端分离 一:虚拟环境搭建的两种方式 1 pipenv的使用 pip install --user pipenv安装pipenv在用户目录下 py -m site ...

  3. Python元组详解

    元组的特征 元组类型的名字是tuple 元组的一级元素不可被修改.不能增加或者删除: 元组和列表的书写区别是将中括号改成了小括号: 为方便区分元组和普通方法的参数,一般在元组的最后一个元素后保持加一个 ...

  4. Navicat Premium怎么设置字段的唯一性(UNIQUE)?

    参考链接:https://blog.csdn.net/Song_JiangTao/article/details/82192189 1.打开你想要设计的表 这里写图片描述2.清楚你想要设计哪个字段为唯 ...

  5. Notepad++ 个人洁癖

    插件: JSON Viewer 可以以树的形式查看JSON,同时可以格式化JSON,增加缩进. NppExport 可以高亮复制 下载地址: https://github.com/chcg/NPP_E ...

  6. vue页面加载前显示{{代码}}的原因及解决办法

    进入正题,简单说说自己对html中出现{{}}的原因及解决办法: 这样写的话,就会出现{{}}一闪的情况: 原因:html的加载顺序: 解析html结构 -> 加载外部脚本和样式表文件 -> ...

  7. requests-验证码登录

    ModuleNotFoundError: No module named 'bs4': 解决方法:pip install beautifulsoup4 https://blog.csdn.net/wi ...

  8. [TJOI2013] 奖学金 - 堆

    按 a 排序,暴力用堆维护两侧预处理, 然后枚举中位数即可 #include <bits/stdc++.h> using namespace std; #define int long l ...

  9. AspxDashboardView 更新参数

    AspxDashboardView 更新参数 function SetThrendDashboardView() { console.log("就是这样被你征服"); var to ...

  10. linux 6.9 补丁修补漏洞

    1 先将openssh-8.0p1.tar.gz 上传到 root下的/opt 文件夹下 解压  tar -zxvf openssh-8.0p1.tar.gz  -C /opt 2 启动vncserv ...