先前綴和一發,問題表示求[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的更多相关文章

  1. JZOJ5894【NOIP2018模拟10.5】同余方程

    题目 Description

随机推荐

  1. sublime的坑

  2. 转载hibernate 的3种 状态 。。

    转自  http://huangtut.iteye.com/blog/261520  对我有帮助,所以收藏了 Hibernate三种状态的区分,以及save,update,saveOrUpdate,m ...

  3. 【Java】JavaWeb文件上传和下载

    文件上传和下载在web应用中非常普遍,要在jsp环境中实现文件上传功能是非常容易的,因为网上有许多用java开发的文件上传组件,本文以commons-fileupload组件为例,为jsp应用添加文件 ...

  4. 2018.10.15 bzoj4445: [Scoi2015]小凸想跑步(半平面交)

    传送门 话说去年的省选计算几何难度跟前几年比起来根本不能做啊(虽然去年考的时候并没有学过计算几何) 这题就是推个式子然后上半平面交就做完了. 什么? 怎么推式子? 先把题目的概率转换成求出可行区域. ...

  5. git分支删除

    1.列出本地分支: git branch 2.删除本地分支: git branch -D BranchName 其中-D也可以是--delete,如: git branch --delete Bran ...

  6. I/O Planning

    同一个BANK的电压必须是一样的,而电气特性则可以不同. 最近GTX调不出来,原来是电平不对 电源的影响 示波器看电源纹波 VCCO是为BANK的IO输出供电.比如LVCMOS33的信号,这个BANK ...

  7. HashMap底层实现原理以及HashMap与HashTable区别以及HashMap与HashSet区别

    ①HashMap的工作原理 HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象.当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算h ...

  8. ACL登陆认证

    前篇文章ACL授权实例介绍了授权,授权完成之后,就要进行认证.ACL的认证主要分为登陆认证与即时认证.所谓登录认证就是在用户登陆的时候,进行信息认证.根据用户Id,加载上来该用户所拥有的权限模块:而即 ...

  9. xlsxwriter

    xlsxwriter是python中用来处理execl表格的库 参考

  10. [ACM_动态规划] hdu 1176 免费馅饼 [变形数塔问题]

    Problem Description 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy的人品实在是太好了,这馅饼别处都不掉,就掉落在他身旁 ...