题意

题目链接

Sol

设\(solve(x, y)\)表示\(i \in [0, x], j \in [0, y]\)满足题目要求的方案数

首先容斥一下,\(ans = solve(r_1, r_2) - solve(l_1 - 1, r_2) - solve(l_2 - 1, r_1) + solve(l_1 -1, l_2 - 1)\)

然后按照套路按位拆分,这里拆的时候是直接对\(x, y\)进行拆分

这样就把问题转换成了看起来似乎简单一些的问题

假设拆完后的数是

110011101

1011

我们只要对于任意一对为1的位,求出小于该位的所有合法解即可

比如\(i = 3, j = 1\)我们要计算的就是\([110010000, 110010111]\)与\([1000, 1001]\)内的合法解

两种都可以写成\([v, v + 2^k]\)的性质

先考虑一种简单的情况,即\(v = 0\)

假设\(i > j\),那么\(\forall z = x \oplus y \leqslant 2^i\), 对于任意的\(x \leqslant 2^j\),都会有唯一的\(y\)与之对应

那么我们只要数出\([0, 2^i]\)中\(\% M == 0\)的数的个数,再乘上\(2^j\)即可

存在\(a[i]\)的限制实际上是一样的。

但是这样统计到的实际上是开区间的信息,只要在右端点处+1即可

#include<iostream>
#include<algorithm>
#define LL long long
using namespace std;
const LL mod = 998244353;
LL l1, r1, l2, r2, M;
LL add(LL x, LL y) {
return (x + y >= mod) ? (x + y - mod) : (x + y);
}
LL calc(LL l, LL r) {
if(l == 0) return ((r / M) + 1) % mod;
return (r / M - (l - 1) / M) % mod;
}
LL solve(LL X, LL Y) {
LL ans = 0;
for(LL i = 0, p1 = X; p1; i++, p1 >>= 1) {
for(LL j = 0, p2 = Y; p2; j++, p2 >>= 1) {
if((p1 & 1) && (p2 & 1)) {
LL x = i, y = j; if(x < y) swap(x, y);
LL ll = ((((p1 ^ 1) << i) ^ ((p2 ^ 1) << j)) >> x) << x;
ans = add(ans, (1ll << y) % mod * calc(ll, ll + (1ll << x) - 1) % mod);
//cout << ans << endl;
}
}
}
// cout << ans << endl;
return ans;
}
int main() {
cin >> l1 >> r1 >> l2 >> r2 >> M;
cout << (solve(r1 + 1, r2 + 1) - solve(l1, r2 + 1) + mod - solve(r1 + 1, l2) + mod + solve(l1, l2) + mod) % mod;
return 0;
}
/*
1 1 1 1 1
*/

牛客提高R5 A.同余方程的更多相关文章

  1. 【牛客提高训练营5A】同余方程

    题目 吉老师的题做不动啊 首先\([l_1,r_1],[l_2,r_2]\)并不是非常好做,我们考虑将其拆成前缀信息 设\(solve(n,m)=\sum_{i=0}^n\sum_{j=0}^m[m| ...

  2. 牛客提高集训营6 C 树(树链剖分)

    题目链接 为了纪(zhuang)念(bi)写完这个树剖单独写一篇.感觉还好,也就6k嘛. 完整比赛题解:https://www.cnblogs.com/SovietPower/p/9826829.ht ...

  3. 牛客提高D6t3 分班问题

    分析 就就就是推柿子 看官方题解吧/px 代码 #include<iostream> #include<cstdio> #include<cstring> #inc ...

  4. 牛客提高D6t2 破碎的序列

    分析 我们不难发现对于偶数的情况只要相邻两个数不相等即可 而对于奇数的情况只要中间恰好隔一个数的两个数不相等即可 于是我们又dp[i][0/1]表示考虑到第i位,这一位和它后面离它最近的一个确定的数是 ...

  5. 牛客提高D6t1 积木大赛

    分析 每次修改用二位差分记录一下 之后对于三维分别统计即可 代码 #include<iostream> #include<cstdio> #include<cstring ...

  6. 牛客提高D5t1 deco的abs

    分析 傻子题? 对d取模后随便贪心即可 代码 #include<iostream> #include<cstdio> #include<cstring> #incl ...

  7. 牛客提高D4t3 清新题

    分析 树上从下往上线性基合并即可 并不需要启发式/xyx 代码 #include<iostream> #include<cstdio> #include<cstring& ...

  8. 牛客提高D4t2 卖羊驼

    分析 不难想到dp[i][j]表示前i个数分了j组的最大值 我们发现这个dp状态有决策单调性 g[i][j]表示对于第i个数它的第j位最近出现的位置 每次一定从这些点转移 预处理即可 似乎还可以做到1 ...

  9. 牛客提高D4t1 麻将

    分析 我们对于每一个点记录他所在的这一行以它为右端点向前最多有几个连续的1 之后我们考虑每一列 对每一列的点按照之前求出的值从小到大排序 一次考虑每一个宽度 而高度也可以很容易的求出 每次取最大值即可 ...

随机推荐

  1. Spring AOP(面向切面编程)

    一.AOP简介 1.AOP概念:Aspect Oriented Programming 面向切面编程 2.作用:本质上来说是一种简化代码的方式 继承机制 封装方法 动态代理 …… 3.情景举例 ①数学 ...

  2. 存入azure table时忽略某个属性

    public class CustomTableEntity : TableEntity { public override IDictionary<string, EntityProperty ...

  3. 并查集简述 (HDU-1213-How Many Tables)

    并查集主要解决集合的有关运算,主要操作是查找操作和并操作. 1.集合的储存方式. 为便于查找,集合通常以树结构储存,每个元素分 数据域和指针域,可以用链式储存,也可以用结构数组储存,用根节点来表示一个 ...

  4. Spring Cloud-服务的注册与发现之服务注册中心(Eureka Server)

    Spring cloud是为了什么产生的? 根据官网的这个介绍来看,我们可以知道,Spring cloud是为开发者提供的一个工具,而使用这个工具的产生就是为了帮助开发者快速的开发一套比较通用的分布式 ...

  5. js定时器的结束和开始

    今天在做一个页面的报表的时候,需要在报表内容改变后屏蔽掉页面上的一些选择框. 因为这个报表是自身的链接实现的改变,我只能读取到history改变了,基于这个来判断 我写了一个判断条件,然后将他放在了一 ...

  6. HDU 6336 (规律 + 二维矩阵的前缀和妙用)

    题目 给出长度为n 的A矩阵 , 按 int cursor = 0; for (int i = 0; ; ++i) { for (int j = 0; j <= i; ++j) { M[j][i ...

  7. HDU - 1085 母函数

    年轻人的第一道母函数入门题 #include<bits/stdc++.h> using namespace std; const int maxn = 1000+2000+5000+1; ...

  8. CDN基本原理和功能浅析

    CDN的全称是Content Delivery Network,即内容分发网络.CDN的通俗理解就是网站加速,CPU均衡负载,可以解决跨运营商,跨地区,服务器负载能力过低,带宽过少等带来的网站打开速度 ...

  9. Apache Shiro(二)-登录认证和权限管理数据库操作

    数据库支持 在上一篇中使用ini 配置文件进行了相关权限数据的配置. 但是实际工作中,我们都会把权限相关的内容放在数据库里. 所以本知识点讲解如何放在数据库里来撸. RBAC 概念 RBAC 是当下权 ...

  10. fis中的数据结构模块Config

    /* * config * caoke */ 'use strict'; Object.extend=function(props){ //继承父类 var prototype=Object.crea ...