CF1245F: Daniel and Spring Cleaning
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))\)。
- \(f(l+1,r)=f(l,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))\)。
- \(f(l,r-1)=f(l,r)-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的更多相关文章
- 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 ...
- CodeForces - 1245F Daniel and Spring Cleaning (数位DP)
While doing some spring cleaning, Daniel found an old calculator that he loves so much. However, it ...
- [cf 1245 F] Daniel and Spring Cleaning
题意: 求区间$[l,r]$内有多少有序数对$(a,b)$满足$a+b=a\bigoplus b$. $l,r\leq 10^9$. 题解: 有用的就一句话: 求区间内一元组可以一维容斥,同理求二元组 ...
- 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, ...
- codeforces 597div2 F. Daniel and Spring Cleaning(数位dp+二维容斥)
题目链接:https://codeforces.com/contest/1245/problem/F 题意:给定一个区间(L,R),a.b两个数都是属于区间内的数,求满足 a + b = a ^ b ...
- 并不对劲的CF1245E&F:Cleaning Ladders
CF1245 E. Hyakugoku and Ladders 题目大意 有一个10 \(\times\) 10的网格,你要按这样的路径行走: 网格中有一些单向传送门,每个传送门连接的两个格子在同一列 ...
- some problem
CF1257F Make Them Similar $solution:$ 折半搜索后考虑如何维护两个数组的和,可以将 $A$ 中每个数减 $A_1$ ,$B$ 中每个数被减 $B_1$ ,$map$ ...
- Codeforces Round #597 (Div. 2)
A - Good ol' Numbers Coloring 题意:有无穷个格子,给定 \(a,b\) ,按以下规则染色: \(0\) 号格子白色:当 \(i\) 为正整数, \(i\) 号格子当 \( ...
- 【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 ...
随机推荐
- 利用Travis IC实现Hexo博客自动化部署
1.Hexo博客的利与弊 Hexo中文 我就默认为看到这篇文章的人都比较了解Hexo博客,也都能够成功手动部署吧.所以第一部分推荐两篇文章一笔带过,让我们快速进入本文的重点内容.实在不知道也不要方先看 ...
- java学习:循环结构的使用规则和注意事项
循环结构的基本组成部分,一般可分为四部分: 初始化语句:在循环开始最初执行,而且只做唯一一次 条件判断:如果成立,则循环继续:如果不成立,则循环退出. 循环体:重复要做的事情内容,若干行语句. 进步语 ...
- Linux学习笔记之LVM基本应用,扩展及缩减实现
0x00 LVM概述 LVM是逻辑盘卷管理(Logical Volume Manager)的简称,它是Linux环境下对磁盘分区进行管理的一种机制,LVM是建立在硬盘和分区之上的一个逻辑层,来提高磁盘 ...
- Win 10下安装 Redis
目录 写在前面 一.安装环境 二.下载windows版本的Redis 三.安装Redis 四.安装服务 五.启动服务 六.测试Redis 七.常用的Redis服务. 写在前面 Redis 是一个开源使 ...
- Wireshark教程之二:Wireshark捕获数据分析
使用 Wireshark 选择需要抓包的网络方式,并设置过滤器条件,当有数据通信后即可抓到对应的数据包,这里将分析其每一帧数据包的结构. 以HTTP协议为例,一帧数据包一般包括以下几个部分: Fram ...
- 理解 Kubernetes 的亲和性调度
这次给大家介绍下k8s的亲和性调度:nodeSelector.nodeAffinity.podAffinity.Taints以及Tolerations用法. 一般情况下我们部署的 POD 是通过集群自 ...
- VS开发C++控制台应用程序(示例)
注:笔者使用的VS版本为2019.1.打开VS2019,选择文件 -> 新建 -> 项目 2.选择项目新建项目时选择C++“控制台应用”语言:C++平台:Windows项目类型:控制台 3 ...
- windows如果在IE中用超链接打开谷歌页面
Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\openChrome] @="URL:openChrome Protocol& ...
- 5.2 odex文件
odex是OptimizedDEX的缩写,是优化过的dex文件 odex两种存在方式: 1. 从apk程序中提取,和apk文件放在一起,后缀 odex,此类文件多是AndroidRom系统文件 2. ...
- mybatis 批量添加数据的两种实现方式
做开发的这几年期间经常遇到类似处理这种形式数据的问题,也遇到很多刚刚入行的新同学,发现他们做处理这块,经验不够,今天特地整理了一下,大家都会遇到的几种情况,代码也都粘贴出来了,拿去不谢,有时间大家还是 ...