jzoj5894
先前綴和一發,問題表示求[0-l2][0-r2]滿足條件的數的個數
假設可以把某一個數拆分成[前面任意個數][00…0-11…1(個數相同)]的區間
那麼問題會簡單的多,因為任意一個a位的整數分別xor[00…0(a個)-11…1(a個)]的結果會取遍00…0-11…1中的任意一個整數
這說明,我們拆出的區間大小都是2的冪次
很顯然想到x&-x操作,這個操作可以把某一個數最後的1去掉,從而新數和舊數形成的區間的大小是2的冪次
但是,x&-x操作是適用于區間開頭為1的情況,所以我們可以將要求的數加上1,記為b
這樣,b-1和b-b&-b就變成了一個合法的結尾為00…0-11…1的區間
我們可以枚舉每一個這樣子的區間,記00…0-11…1的長度,第一個區間為a,第二個為b
那麼異或起來的結果就是[兩個區間在max(a,b)之前的長度異或起來][max(a,b)個00…0-11…1]
這樣,問題就變成了求出連續區間中能被m整除的數的個數
實現上,我們可以枚舉a+1和b+1的每一個1位,則a+1在這一位後面和b+1在這一位後面的數全為00…0-11…1
然後我們可以把a和b的這一位去掉取前面的所有位,這樣可以計算出前面的部分
注意別忘記求出來的結果乘以另一個較短的位的00…0-11…1的數的個數
代碼:
#include<bits/stdc++.h>
using namespace std;
#define mo 998244353ll
typedef long long ll;
ll m;
ll get(ll l,ll r){
if(l%m==0)return (r/m-l/m+1ll+mo)%mo;
return (r/m-l/m+mo)%mo;
}
ll ct(ll a,ll b){
ll ans=0;
for(ll i=61;i>=0;i--)
for(ll j=61;j>=0;j--)
if((a&(1ll<<i))&&(b&(1ll<<j))){
ll m1=max(i,j),m2=min(i,j);
ll pre=((a^(1ll<<i))^(b^(1ll<<j)))&(~((1ll<<m1)-1ll));
ll suf=pre+(1ll<<m1)-1ll;
ans=(ans+get(pre,suf)*((1ll<<m2)%mo)%mo)%mo;
}
return ans;
}
int main(){
freopen("mod.in","r",stdin);
freopen("mod.out","w",stdout);
ll a,b,c,d;
scanf("%lld%lld%lld%lld%lld",&a,&b,&c,&d,&m);
printf("%lld",(ct(b+1,d+1)-ct(b+1,c)-ct(a,d+1)+ct(a,c)+mo)%mo);
}
jzoj5894的更多相关文章
- JZOJ5894【NOIP2018模拟10.5】同余方程
题目 Description
随机推荐
- 获取url路径中的参数
简介 运用js的时候,我们有时可能会有这样的需求,就是想要获取浏览器地址栏指定的一项参数,形如:https://i.cnblogs.com/EditPosts.aspx?postid=8628413& ...
- Codeforces 677C. Vanya and Label 位操作
C. Vanya and Label time limit per test:1 second memory limit per test:256 megabytes input:standard i ...
- 2015湖南湘潭 D 二分
2015湖南湘潭第七届大学生程序设计比赛 D题 Fraction Accepted : 133 Submit : 892 Time Limit : 1000 MS Memory Limit : ...
- c++ 中的符号与关键字
符号按照符号的ASC码数值从小到达排列,关键字按照英文字母排序. & [38] 位运算:取地址:左值引用[指针.引用都是可以做类型转换的] #include <iostream> ...
- vi 编辑器常用命令(转)
常用vi编辑器命令行 对于VI的命令行,不需要特意的去记忆,写下来,让要用到的时候能找到就行 游标控制 h 游标向左移 j 游标向下移 k 游标向上移 l (or spacebar) 游标向右移 w ...
- Spring.NET学习笔记7——依赖对象的注入(基础篇) Level 200
1.person类 public class Person { public string Name { get; set; } public int Age { g ...
- 如何使用tapd?
tapd 可以编写测试用例 测试计划等 敏捷开发常用的工具.稍后会更新..
- 20155213 2016-2017-2 《Java程序设计》第八周学习总结
20155213 2016-2017-2 <Java程序设计>第八周学习总结 教材学习内容总结 第十四章NIO与NIO2 NIO NIO使用频道来衔接数据节点,在处理数据时,NIO可以让你 ...
- 判定map中是否存在某元素
判断某key是否存在可以使用map的count方法来间接判定 count接受一个参数key值,返回map中key值为给定值的元素总数 map<int, string> i_to_s_map ...
- java如何实现以数据流的形式下载压缩包到本地?
先不多说,直接贴代码吧,在服务器的E盘下放一个E:/manual.rar的压缩包 package com.cellstrain.icell.controller; import org.springf ...