题目链接:

http://172.16.0.132/senior/#contest/show/2523/0

题目:

题解:(部分内容来自https://blog.csdn.net/gmh77/article/details/82947340)

首先我们容斥一下,设calc(l,r)为i∈[1,l],j∈[q,r]的方程的解的个数,显然答案等于calc(r2,r1)-calc(l1-1,r2)-calc(r1,l2-1)+calc(l1-1,l2-1)

考虑如何计算calc(l,r)

对于l和r,从低位向高位枚举每一个二进制位1,强制把这个1改成0,这样可以保证得到的数小于原来的数并且没有算重。假设l改变第i位,r改变第j位

(假设l不同的位比r后)

那么用红框表示已知部分,蓝框表示未知部分

所以异或之后就会变成这样

中间的紫色部分表示一半已知,一半未知,后面的蓝色部分表示完全未知


显然未知部分可以取到任何可能

考虑中间的紫色部分,由于$a$紫色部分确定,$b$紫色部分不确定,那么对于每一个$b$的紫色部分都对应一个$c$的紫色部分

也就是说,每一个$b$确定$2^{蓝色部分长度}$个$c$,且我们一共有$2^{max(i,j)}-1$个$b$。由于未知部分可以取到任何可能,所以我们一共有$2^{max(i,j)}-1$个$c$

考虑到每个c肯定是平等的,那么每个c就被计算了$\frac{2^{蓝色部分长度} \times (2^{max(i,j)}-1)}{2^{max(i,j)}-1}=2^{蓝色部分长度}$次

$mx=max(i,j)$,发现c的取值就是[((S/p[mx])*mx)^p[mx],((S/p[mx])*mx)^p[mx]+p[mx]-1],p[mx]=1<<mx

注意到第mx位是需要和原来相反的,所以要^p[mx]


还有三种情况

1.i==j

这个其实差不多,只是第mx位不需要取反,也就是不需要^p[mx]

2.a或b不改任何一位

这个也是一样的,注意一下变的那一个枚举的任何一位都需要取反

3.a和b都不变

这个直接异或一下直接判断就是了

#include<cstring>
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll; const int N=;
const int mod=;
ll m;
ll bin[N],p[N];
int a[N],b[N];
ll get(ll l,ll r)
{
if (l>r) return ;
if (l) return (r/m-(l-)/m)%mod;
else return (r/m+)%mod;//要考虑0
}
ll calc(ll l,ll r)
{
int A=-,B=-;
ll res=,S=l^r;
while (l)
{
a[++A]=l&;
l>>=;
}
while (r)
{
b[++B]=r&;
r>>=;
}
for (int i=;i<=A;i++)
if (a[i]) res=(res+get(((S/p[i])*p[i])^p[i],((S/p[i])*p[i])^p[i]+p[i]-))%mod;//b不变
for (int i=;i<=B;i++)
if (b[i]) res=(res+get(((S/p[i])*p[i])^p[i],((S/p[i])*p[i])^p[i]+p[i]-))%mod;//a不变
for (int i=;i<=A;i++)
if (a[i])
for (int j=;j<=B;j++)
if (b[j])
{
int mx=max(i,j);//特判i==j
if (i!=j) res=(res+get(((S/p[mx])*p[mx])^p[mx],((S/p[mx])*p[mx])^p[mx]+p[mx]-)*bin[min(i,j)])%mod;
else res=(res+get(((S/p[mx])*p[mx]),((S/p[mx])*p[mx])+p[mx]-)*bin[min(i,j)])%mod;
}
return res+((S%m)==);//i==l&&j==r
}
int main()
{
freopen("mod.in","r",stdin);
freopen("mod.out","w",stdout);
p[]=;bin[]=;
for (int i=;i<N;i++)
{
p[i]=p[i-]<<;
bin[i]=p[i]%mod;
}
ll l1,r1,l2,r2;
scanf("%lld%lld%lld%lld%lld",&l1,&r1,&l2,&r2,&m);
printf("%lld\n",((calc(r1,r2)-calc(l1-,r2)-calc(r1,l2-)+calc(l1-,l2-))%mod+mod)%mod);
return ;
}

[JZOJ 5894] [NOIP2018模拟10.5] 同余方程 解题报告(容斥)的更多相关文章

  1. [JZOJ 5912] [NOIP2018模拟10.18] VanUSee 解题报告 (KMP+博弈)

    题目链接: https://jzoj.net/senior/#contest/show/2530/2 题目: 众所周知,cqf童鞋对哲学有着深入的理解和认识,并常常将哲学思想应用在实际生活中,例如锻炼 ...

  2. [JZOJ 5910] [NOIP2018模拟10.18] DuLiu 解题报告 (并查集+思维)

    题目链接: https://jzoj.net/senior/#contest/show/2530/0 题目: LF是毒瘤出题人中AK IOI2019,不屑于参加NOI的唯一的人.他对人说话,总是满口垃 ...

  3. [JZOJ 5895] [NOIP2018模拟10.5] 旅游 解题报告 (欧拉回路+最小生成树)

    题目链接: https://jzoj.net/senior/#main/show/5895 题目: 题解: 有一个好像比较显然的性质,就是每条边最多经过两次 那么我们考虑哪些边需要经过两次.我们把需要 ...

  4. [JZOJ 5906] [NOIP2018模拟10.15] 传送门 解题报告(树形DP)

    题目链接: https://jzoj.net/senior/#contest/show/2528/2 题目: 8102年,Normalgod在GLaDOS的帮助下,研制出了传送枪.但GLaDOS想把传 ...

  5. [JZOJ 5911] [NOIP2018模拟10.18] Travel 解题报告 (期望+树形DP)

    题目链接: http://172.16.0.132/senior/#contest/show/2530/1 题目: EZ同学家里非常富有,但又极其的谦虚,说话又好听,是个不可多得的人才.        ...

  6. [jzoj 5926] [NOIP2018模拟10.25] naive 的图 解题报告(kruskal重构树+二维数点)

    题目链接: https://jzoj.net/senior/#main/show/5926 题目: 题解: 显然最小的最大路径在最小生成树上(最小生成树=最小瓶颈生成树) 于是我们建出kruskal重 ...

  7. [JZOJ 5893] [NOIP2018模拟10.4] 括号序列 解题报告 (Hash+栈+map)

    题目链接: https://jzoj.net/senior/#main/show/5893 题目: 题解: 考虑暴力怎么做,我们枚举左端点,维护一个栈,依次加入元素,与栈顶元素和栈内第二个元素相同时弹 ...

  8. [JZOJ 5908] [NOIP2018模拟10.16] 开荒(kaihuang)解题报告 (树状数组+思维)

    题目链接: https://jzoj.net/senior/#contest/show/2529/1 题目: 题目背景:尊者神高达作为一个萌新,在升级路上死亡无数次后被一只大黄叽带回了师门.他加入师门 ...

  9. [JZOJ 5909] [NOIP2018模拟10.16] 跑商(paoshang) 解题报告 (圆方树)

    题目链接: https://jzoj.net/senior/#contest/show/2529/2 题目: 题目背景:尊者神高达很穷,所以他需要跑商来赚钱题目描述:基三的地图可以看做 n 个城市,m ...

随机推荐

  1. Flask_URL和视图

    1.Flask_URL和视图 1.1.第一个flask程序   from flask import Flask #创建一个Flask对象,传递__name__参数进去 app = Flask(__na ...

  2. 转:如何在Ubuntu 14.04中安装最新版Eclipse

    想必很多开发人员都知道,Ubuntu 软件源中提供的并不是最新版本的 Eclipse,本教程就教大家如何在 Ubuntu 14.04 中快速安装 Eclipse 官方发布的最新版本. 到目前为止,Ec ...

  3. Spark RDD概念学习系列之什么是Pair RDD

    不多说,直接上干货! 什么是Pair RDD (1)包含键值对类型的RDD被称作Pair RDD. (2)Pair RDD通常用来进行聚合计算. (3)Pair RDD通常由普通RDD做ETL转换而来 ...

  4. git提交不用每次都输入用户名密码

    克隆项目二种方式: 1. 使用https url克隆,   复制https url 然后到 git clone https-url 2.使用 SSH url 克隆却需要在克隆之前先配置和添加好 SSH ...

  5. CSS3中的2D和3D转换知识介绍

    一  2D转换 转换是CSS3中具有颠覆性的特征之一,可以实现元素的位移.旋转.变形.缩放,甚至支持矩阵方式,配合即将学习的过渡和动画知识,可以取代大量之前只能靠Flash才可以实现的效果. 1.移动 ...

  6. iOS11即将到来,让我们具体了解下

    谷歌开发者大会后,苹果的WWDC终于也要来了,目前准确时间已经确定. 近日,苹果官方发出的公告显示,WWDC 2017将在北京时间6月6日凌晨1点正式进行,同时他们强调会进行现场直播,用户可以在苹果主 ...

  7. JEE Spring-boot 简单的ioc写法。

    什么是ioc,就是你可能会有一些生活必需品,这些东西你必须要用才能存活.但是你不是每天都回去买,去哪一家点去买.而这些用品会一直放在哪里,每一个商店就是一个容器,包裹着这些物品. 创建ioc项目,首先 ...

  8. mysql update join优化update in查询效率

    数据库版本:5.6.16 update in 修改数据,结果执行时间过慢,一直不出结果. SQL语句及执行计划如下: UPDATE erp_order_extra SET last_time=1231 ...

  9. 杭电 1114 Piggy-Bank【完全背包】

    解题思路,首先很容易想到方程f[v]=min(f[v],f[v-w[i]+p[i]),因为是要求当包装满的时候(因为题目中给出的是包的质量是一定的),包里面装的钱最少,所以将f[]初始化成一个很大的数 ...

  10. 8、Situation-Dependent Combination of Long-Term and Session-Based Preferences in Group Recommendations: An Experimental Analysis ----组推荐中基于长期和会话偏好的情景依赖组合

    一.摘要: 背景:会话组推荐系统的一个主要挑战是如何适当地利用群组成员之间的交互引起用户偏好,这可能会偏离用户的长期偏好.长期偏好和群组诱导的偏好之间的相对重要性应该根据具体的群组设置而变化. 本文: ...