CF1245F: Daniel and Spring Cleaning

题意描述:

  • 给定区间\([L,R]\),其中 \((0\leq L,R\leq 10^9)\),问在区间内有多少数对\((x,y)\)满足\(x+y==x\land y\)。

输入描述:

  • 第一行输入一个\(T\)表示测试样例数目。
  • 接下来每一个测试样例输入两个整数\(L,R\)表示区间。

输出描述:

  • 输出一个整数表示答案。

思路:

  • 首先对条件进行变形。
  • \(x+y==x\land y\),有\(x\&y==0\),证明略。
  • 那么题目要求的就转化为区间内\(x\&y==0\)的数对数量。
  • 定义\(f(l,r)\)为\([l,r)\)区间内满足条件的数对的数量。那么显然有\(f(0,r)=2r+f(1,r)\),因为\(0\)可以和任意数字组合。
  • 性质:\(f(2l,2r)=3f(l,r)\)。
    • 证明:
    • 考虑满足条件的数对\((x,y)\)的二进制表示。对于最右边的位置,有三种选择方式\((0,1),(1,0),(0,0)\)。
    • 选择其他位的方法是\(f(l,r)\),因此\(f(2l,2r)=3f(l,r)\)。
  • 这样我们可以每次对范围除以\(2\),但这样就要保证我们的\(l,r\)是偶数,当他不是偶数的时候可以进行如下操作。
  • 定义\(g(x,n)\)为满足以下条件的\(y\)的个数。
    • \(0\leq y<n\)
    • \(x\&y==0\)
  • 那么当\(l\)是奇数的时候:
    • \(f(l+1,r)=f(l,r)-2(g(l,r)-g(l,l))\)。

      • 解释:由最上方定义的那个性质可以知道:\(f(l,r)=num+f(l+1,r)\),其中\(num\)是\(l\)与\([l,r]\)区间内的数满足条件的数对\((l,x)\)数量\((x\in[l,r])\)。
      • 那么由\(g(i,j)\)的定义可知,\(g(l,r)\)表示\(l\)在\([0,r]\)范围内满足条件的\(y\)的个数,\(g(l,l)\)表示在\([0,l)\)范围内满足条件的\(y\)的个数,那么两个相减就是\([l,r)\)区间内满足条件数对的数量。当然要\(*2\),因为\((x,y)\)与\((y,x)\)为两种情况。
    • 变形为\(f(l,r)=f(l+1,r)+2(g(l,r)-g(l,l))\)。
  • 同样的当\(r\)为奇数的时候有:
    • \(f(l,r-1)=f(l,r)-2(g(r-1,r)-g(r-1,l))\)。

      • 解释:他的差值也就是\(r-1\)在\([l,r)\)内有多少满足条件的数对。
    • \(f(l,r)=f(l,r-1)+2(g(r-1,r)-g(r-1,l))\)。
  • 于是我们只需要考虑如何快速的计算\(g(i,j)\)。
  • 定义\(h(x,n)\)为满足下列条件的\(y\)的数量。
    • \(n-lowbit(n)\leq y<n\)
    • \(x\& y==0\)
  • 那么有\(g(x,n)=h(x,n)+g(x,n-lowbit(n))(n>0)\)。
  • 对于\(h(x,n)\),我们可以在\(logn\)的时间内计算出来。

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll; ll g(int a, int b)
{
ll res = 0;
ll num = 0; for(int i = 1; i <= b; i <<= 1)
{
if(b & i)
{
b ^= i;
if(!(a&b)) res += 1<<num;
}
if(!(a&i)) num++;
} return res;
} ll calc(int a, int b)
{
if(a == b) return 0;
if(a == 0) return 2*b - 1 + calc(1, b);
ll res = 0;
if(a & 1)
{
//f(l,r)=f(l+1,r)+2(g(l,r)-g(l,l))
res += 2 * (g(a, b) - g(a,a));
a++;
}
if(b & 1)
{
//f(l,r)=f(l,r-1)+2(g(r-1,r)-g(r-1,l))
res += 2 * (g(b-1, b) - g(b-1, a));
b--;
}
return res + 3 * calc(a/2, b/2);
} int main()
{
int T; cin >> T;
int a, b;
while(T--)
{
cin >> a >> b;
cout << calc(a, b+1) << endl;
}
return 0;
}

CF1245F: Daniel and Spring Cleaning的更多相关文章

  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. CodeForces - 1245F Daniel and Spring Cleaning (数位DP)

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

  3. [cf 1245 F] Daniel and Spring Cleaning

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

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

  5. codeforces 597div2 F. Daniel and Spring Cleaning(数位dp+二维容斥)

    题目链接:https://codeforces.com/contest/1245/problem/F 题意:给定一个区间(L,R),a.b两个数都是属于区间内的数,求满足 a + b = a ^ b ...

  6. 并不对劲的CF1245E&F:Cleaning Ladders

    CF1245 E. Hyakugoku and Ladders 题目大意 有一个10 \(\times\) 10的网格,你要按这样的路径行走: 网格中有一些单向传送门,每个传送门连接的两个格子在同一列 ...

  7. some problem

    CF1257F Make Them Similar $solution:$ 折半搜索后考虑如何维护两个数组的和,可以将 $A$ 中每个数减 $A_1$ ,$B$ 中每个数被减 $B_1$ ,$map$ ...

  8. Codeforces Round #597 (Div. 2)

    A - Good ol' Numbers Coloring 题意:有无穷个格子,给定 \(a,b\) ,按以下规则染色: \(0\) 号格子白色:当 \(i\) 为正整数, \(i\) 号格子当 \( ...

  9. 【oneday_onepage】——Ten Changes To Make A Difference In Your Life

    When you want to change something in your life, it can feel overwhelming. Whether it’s losing 50lbs ...

随机推荐

  1. 【题解】Luogu P5471 [NOI2019]弹跳

    原题传送门 先考虑部分分做法: subtask1: 暴力\(O(nm)\)枚举,跑最短路 subtask2: 吧一行的点压到vector中并排序,二分查找每一个弹跳装置珂以到达的城市,跑最短路 sub ...

  2. python中用分别用selenium、requests库实现Windows认证登录

    最近在搞单位的项目,实现python自动化,结果在第一步就把我给拒之门外,查资料问大佬,问我们开发人员,从周一折腾到周五才搞定了 接下给大家分享一下 项目背景:我们系统是基于Windows平台实现的, ...

  3. ASP.NET MVC 允许跨域请求设置

    场景:创建一个图片上传的站点,用于其他站点跨域上传附件和图片之类. 上传插件结合百度的 webuploader.js 经常会碰到,跨域的问题,如下, 处理方式呢,是在web.config 中配置允许跨 ...

  4. 一.B/S架构和C/S架构

    1.B/S架构 Browser-Server,  浏览器和服务器架构.包含客户端浏览器.web应用服务器.数据库服务器的软件系统.用户只需要一个浏览器就可以访问服务.系统更新的时候,只需要更新服务端, ...

  5. python中字典的建立

    一.字典由键key与值value构成. 如: a={'d':6,'f':'va'}print(a['f']) 上面代码简单建立字典,其中需要访问字典需要输入键值. 二.又比如需要在某个关键字中添加数据 ...

  6. 03、新手必须掌握的Linux命令

    Ⅰ. 常用系统工作命令 1. echo 命令 echo命令用于在终端输出字符串货变量提取后的值,格式为"echo [字符串 | $变量]" 例:把指定字符串"LinxuH ...

  7. w3c网站案例

    w3c网站 reset操作 body { background-color: #eee; } html, body, h1, h2, h3, h4, h5, h6, ul, p { margin: 0 ...

  8. Fedora 31 Beta 发布

    Matthew Miller宣布发布Fedora 31 Beta.它不仅准时,而且还带来许多激动人心的更新.Fedora 31 Beta附带全新的GNOME 3.34桌面及其许多改进/功能,这对于更好 ...

  9. java手写多级缓存

    多级缓存实现类,时间有限,该类未抽取接口,目前只支持两级缓存:JVM缓存(实现 请查看上一篇:java 手写JVM高性能缓存).redis缓存(在spring 的 redisTemplate 基础实现 ...

  10. 关于DataX

    1. 关于DataX 1.1. 前言 为什么写这篇文章,因为初出茅庐的时候,曾经遇到的一个面试官就是DataX的作者之一,而当时我还偏偏因为业务需求做了个数据库的同步工具,我当时不知道他做过这么专业的 ...