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,r)-2F(l-1,r)+F(l-1,l-1)$

意思就是总方案减去 $a,b$ 至少一个数小于 $l$ 再加上 $a,b$ 都小于 $l$ 的方案

然后现在考虑求 $F$

首先显然 $a+b=a \text{ xor } b$ 意思就是二进制下不存在同时为 $1$ 的位

那么可以考虑简单的数位 $dp$,设 $f[i][0/1][0/1]$ 表示从高到低位填了 $i$ 位,$a$ 是否贴着上限 $n$ , $b$ 是否贴着上限 $m$ ,时的合法数对 $a,b$ 的方案数

那么转移就枚举下一位 $a$ 填的 $0$ 还是 $1$ , $b$ 填的 $0$ 还是 $1$ ,顺便保证一下满足限制就行了

代码参考:jiangly

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
inline int read()
{
    int x=0,f=1; char ch=getchar();
    while(ch<‘0‘||ch>‘9‘) { if(ch==‘-‘) f=-1; ch=getchar(); }
    while(ch>=‘0‘&&ch<=‘9‘) { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
    return x*f;
}
ll solve(int n,int m)//注意此时的n,m是开区间
{
    if(n<0||m<0) return 0;
    ll f[2][2][2]; int p=0;
    f[p][0][0]=f[p][0][1]=f[p][1][0]=0; f[p][1][1]=1;
    //0表示没贴着上限,1表示贴着上限
    for(int i=30;i>=0;i--)
    {
        p^=1; memset(f[p],0,sizeof(f[p]));//滚动数组
        for(int ln=0;ln<=1;ln++)
            for(int lm=0;lm<=1;lm++)
                for(int x=0;x<=1;x++)
                    for(int y=0;x+y<=1;y++)
                        if( ((!ln)||x<=((n>>i)&1)) && ((!lm)||y<=((m>>i)&1)) )
                            f[p][ln & ( x == ((n>>i)&1) )][lm & ( y == ((m>>i)&1) )] +=
                            f[p^1][ln][lm];
    }
    return f[p][0][0];//不包括恰好等于n,m的情况
}
int main()
{
    int T=read();
    while(T--)
    {
        int l=read(),r=read();
        printf("%lld\n",solve(r+1,r+1)-solve(l,r+1)*2+solve(l,l));//开区间,右端点集体+1
    }
    return 0;
}

原文地址:https://www.cnblogs.com/LLTYYC/p/11785913.html

时间: 2024-08-30 09:16:00

Codefroces 1245 F. Daniel and Spring Cleaning的相关文章

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\),证明略.

Codeforces 1245F. Daniel and Spring Cleaning(容斥原理+数位DP)

传送门 题目大意 给你两个数,\(l,r\) 求 \([l,r]\) 中多少对 \(a+b=a\oplus b\). 思路 看了大佬的题解才知道这里要用到二维容斥. 设 \(f_{x,y}\) 是 \(a\in [0,x],b\in [0,y]\) 时满足条件的对数 那么根据容斥原理答案就是 \(f_{r,r}-f_{l-1,r}\times 2+f_{l-1,l-1}\) 对于其中每一部分都可以用一次数位DP求出来 因为这里对于统计有影响的因素只有两个数是否被限制 那么状态可以直接设计为 \(

并不对劲的CF1245E&amp;F:Cleaning Ladders

CF1245 E. Hyakugoku and Ladders 题目大意 有一个10 \(\times\) 10的网格,你要按这样的路径行走: 网格中有一些单向传送门,每个传送门连接的两个格子在同一列.传送门的方向一定是从下往上的,而且每个格子的出度至多为1,最上面一行的格子没有出去的传送门. 你的行走步骤是这样: 1.抛一枚六面骰子,如果往前走点数步不会走超过终点就往前走点数步,反之站着不动并且跳过第二步: 2.如果这一点有传送门,可以选择进传送门或不进. 在恰好走到终点上之前,你会不断重复以

spring实现文件上传(图片解析)

合抱之木,生于毫末,千里之行,始于足下,要想了解spring的文件上传功能,首先要知道spring是通过流的方式将文件进行解析,然后上传.那么是不是所有需要用的文件上传的地方都要写一遍文件解析器呢? 放心,spring这个大管家已经为我们做好了一切! 我们只需要在spring的配置文件中加入下面代码: <!-- 文件上传解析器 --> <bean id="multipartResolver" class="org.springframework.web.mu

spring cloud学习过程中遇到的几个问题

一直开发维护公司原有项目,很少有用spirng cloud来开发,今天来学习下,把自己遇到的坑说下 spring cloud与spring boot对应的版本要求很高.学习spring cloud自然是先去找一个别人的demo来运行跑起来,我在git地址上找了一个https://github.com/SoftwareKing/sc-gateway/tree/master/ch1 下载好后,当然先允许eureka server服务,结果发现报错,报错有几个Caused by,里面有一个Caused

Spring Cloud Stream如何消费自己生产的消息

在上一篇<Spring Cloud Stream如何处理消息重复消费>中,我们通过消费组的配置解决了多实例部署情况下消息重复消费这一入门时的常见问题.本文将继续说说在另外一个被经常问到的问题:如果微服务生产的消息自己也想要消费一份,应该如何实现呢? 常见错误 在放出标准答案前,先放出一个常见的错误姿势和告警信息(以便您可以通过搜索引擎找到这里^_^).以下错误基于Spring Boot 2.0.5.Spring Cloud Finchley SR1. 首先,根据入门示例,为了生产和消费消息,需

Spring 学习,看松哥这一篇万余字干货就够了!

1. Spring 简介 我们常说的 Spring 实际上是指 Spring Framework,而 Spring Framework 只是 Spring 家族中的一个分支而已.那么 Spring 家族都有哪些东西呢? Spring 是为了解决企业级应用开发的复杂性而创建的.在 Spring 之前,有一个重量级的工具叫做 EJB,使用 Spring 可以让 Java Bean 之间进行有效的解耦,而这个操作之前只有 EJB 才能完成,EJB 过于臃肿,使用很少.Spring 不仅仅局限于服务端的

Python学习系列(九)(IO与异常处理)

Python学习系列(九)(IO与异常处理) Python学习系列(八)( 面向对象基础) 一,存储器 1,Python提供一个标准的模块,称为pickle,使用它既可以在一个文件中存储任何Python对象,又可以把它完整的取出来,这被称为持久的存储对象.类似的,还有一个功能与之相同的模块—cPickle,用c语言编写的,速度比pickle快1000倍. 2,示例: 1 import cPickle as p 2 shoplistfile='shoplist.data' 3 shoplist=[

TPCx-BB源码分析

Copy from: 一篇文章看懂TPCx-BB(大数据基准测试工具)源码 TPCx-BB是大数据基准测试工具,它通过模拟零售商的30个应用场景,执行30个查询来衡量基于Hadoop的大数据系统的包括硬件和软件的性能.其中一些场景还用到了机器学习算法(聚类.线性回归等).为了更好地了解被测试的系统的性能,需要对TPCx-BB整个测试流程深入了解.本文详细分析了整个TPCx-BB测试工具的源码,希望能够对大家理解TPCx-BB有所帮助. 代码结构 主目录($BENCH_MARK_HOME)下有: