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. Tomcat 路由请求的实现 Mapper

    在分析 Tomcat 实现之前,首先看一下 Servlet 规范是如何规定容器怎么把请求映射到一个 servlet.本文首发于(微信公众号:顿悟源码) 1. 使用 URL 路径 收到客户端请求后,容器 ...

  2. Kafka学习笔记之Kafka日志删出策略

    0x00 概述 kafka将topic分成不同的partitions,每个partition的日志分成不同的segments,最后以segment为单位将陈旧的日志从文件系统删除. 假设kafka的在 ...

  3. javascript query string

    function getQueryVariable(variable) { var query = window.location.search.substring(1); var vars = qu ...

  4. 同级frame之间的通信与跳转

    项目最近需求两个同级的frame,通过点击一个frame里面的btn按钮来实现另一个frame的跳转(注意这俩个frame在同一个frameset下面): 原理:通过该frame找到父frameset ...

  5. Quartz.net使用笔记

    一.需求场景:每天固定时间执行某个行为/动作. 一开始想用定时器,后来无意间发现了这个插件,感觉功能太强大了,完美解决了我的问题. 二.下载地址:https://www.quartz-schedule ...

  6. 类嵌套_list泛型_餐馆点菜例

    form1内容: private void button1_Click(object sender, EventArgs e) { //声明并初始化一张点菜清单 yiduicai danzi = ne ...

  7. docker,containerd,runc,docker-shim之间的关系

    原文:https://blog.csdn.net/u013812710/article/details/79001463 关于containerd关于containerd的一些详解介绍,请参考cont ...

  8. 根据语义来选择:value-like传副本, pointer-like传引用

    ★ (一个成员)变量的 创建.初始化.赋值 “默认值”:内置类型的局部变量.内置类型的成员变量(未设置=initval;) 没有默认值!  若创建时不指定值,则不进行初始化.则其值未定义!!! “指定 ...

  9. Vue--基础1

    目录 Vue MVVM模式 Hello World示例 挂载点 插值表达式与过滤器 Vue指令 文本指令 属性指令 事件指令 表单指令 条件指令 pre指令 循环指令 案例 Vue Vue是一个轻量级 ...

  10. 《JavaScript高级程序设计》笔记:高级技巧

    高级函数 安全的类型检测 在任何值上调用Object原生的toString()方法,都会返回一个[object NativeConstructorName]格式的字符串.每个类在内部都有一个[[Cla ...