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. SQL系列(五)—— 排序(order by)

    对查询结果进行排序是日常应用开发中最为常见的需求,在SQL中通过order by实现.order by是select语句中一部分,即子句. 1.order by 1.1 单列排序 其实,检索出的数据并 ...

  2. golang ----并发 && 并行

    Go 语言的线程是并发机制,不是并行机制. 那么,什么是并发,什么是并行? 并发是不同的代码块交替执行,也就是交替可以做不同的事情. 并行是不同的代码块同时执行,也就是同时可以做不同的事情. 举个生活 ...

  3. 用友U9 UFSoft.UBF.Business.Session

    Session的概念 在现在UBF中,Session的本意是work unit,即持久层的一个边界,非常轻,主要用作批量提交,并标识这次批量提交的边界,不涉及到事务等概念. 当前ISession可以通 ...

  4. 类型和变量(C#学习笔记02)

    类型和变量 [C#类型和变量(原文参考官方教程)]https://docs.microsoft.com/zh-cn/dotnet/csharp/tour-of-csharp/types-and-var ...

  5. win10企业版|激|活|码

    使用下面的激活码升级成企业版 NPPR9-FWDCX-D2C8J-H872K-2YT43 激活后,如果右下角出现未激活的白色字体用cmd命令,管理员窗口运行下面的命令 win10企业版用户请依次输入: ...

  6. 接口XMPPConnection

    接口XMPPConnection 所有已知的实现类: AbstractXMPPConnection,XMPPBOSHConnection,XMPPTCPConnection 公共接口XMPPConne ...

  7. 掌握算法&数据结构的正确方式

  8. Django--视图函数

    目录 视图函数 HttpRequest对象 request属性 request常用方法 HttpResponse对象 render() redirect() JsonResponse 视图函数 一个视 ...

  9. Java实现简易聊天室

    Java实现简易聊天室 在学习<Java从入门到精通>这本书,网络通信,基于TCP实现的简易聊天室,我这里对书中的代码略做了修改,做个记录. 这里先放一下运行效果图,代码放在最后. 运行效 ...

  10. Nexus6p手机root和安装xposed

    进行root前需要两个前提条件 解锁OEM 进入开发者选项:设置-〉关于-〉一直点版本号会出现,usb调试打开 手机连接pc命令行输入: adb reboot bootloader 进入bootloa ...