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. ubuntu docker inflxudb(安装 使用 备份 还原 以及python编码) telegraf Grafana

    inflxudb1.7.7 1.拉取最新的镜像 docker pull influxdb 2.运行实例: docker run -d --restart=always -p 8086:8086 -p ...

  2. Java学习:static 关键字概述

    static 关键字概述 一旦用了static关键字,那么这样的内容不再属于对象自己.而是属于类的,所以凡是本类的对象,都共享同一份. 如果没有static关键字,那么必须首先创建对象,然后通过对象才 ...

  3. sqlserver获得数据库非聚集索引的代码

    创建Index DECLARE @zindex_sql NVARCHAR(max); SET @zindex_sql = N''; SELECT @zindex_sql = @zindex_sql + ...

  4. - 集合 遍历 foreach Iterator 并发修改 ConcurrentModificationException MD

    目录 目录 为什么不能在 foreach 循环里进行元素的 remove/add 操作 背景 foreach 循环 问题重现 fail-fast remove/add 做了什么 正确姿势 直接使用普通 ...

  5. Google Guava Cache 全解析

    Google guava工具类的介绍和使用https://blog.csdn.net/wwwdc1012/article/details/82228458 LoadingCache缓存使用(Loadi ...

  6. SQL Server优化之SET STATISTICS开关(转载)

    一.准备工作 缓存对于某个查询的性能影响十分之大,所以优化之前要清空缓存. 清除Buffer Pool里面的所有缓存 DBCC DROPCLEANBUFFERS 清除Buffer Pool里的所有缓存 ...

  7. C#读写调整UVC摄像头画面-饱和度

    有时,我们需要在C#代码中对摄像头的饱和度进行读和写,并立即生效.如何实现呢? 建立基于SharpCamera的项目 首先,请根据之前的一篇博文 点击这里 中的说明,建立基于SharpCamera的摄 ...

  8. 14、vue-cli脚手架搭建项目

    1:全局安装vue-cli:npm install --global vue-cli2:进入你的项目目录:cd myProject3:初始化创建项目:vue init webpack vue-demo ...

  9. JavaScript 数组(二)数组练习

    1.求一组数中的最大值和最小值,以及所在位置(最大值和最小值在这组数中的位置) var numbers = [120, 13, 101, 88, 10, 25]; var max = numbers[ ...

  10. Object-C与标准C/C++混合编程

    转自:http://www.xue5.com/Mobile/iOS/661674.html 如何将C++和Object-C混合编程开发IOS软件(Object-c调用C++) 原文网址:http:// ...