先前綴和一發,問題表示求[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. WARNING [main] org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [] milliseconds.

    编译安装tomcat-native和tomcat-deamon以后,发现toomcat启动很慢,好久才有响应.以下日志供参考: 11-Sep-2017 12:19:28.102 INFO [main] ...

  2. css水波动画效果

    代码来源:http://www.jq22.com/code1526 HTML: <div class="waves"></div> css: html, b ...

  3. tp5链接访问

    方法名:admin/DayActive/statistic 访问:admin/day_active/statistic

  4. boost::asio 学习草稿

    http://www.gamedev.net/blog/950/entry-2249317-a-guide-to-getting-started-with-boostasio/ 可以多个线程拥有io_ ...

  5. Devexpress VCL Build v2014 vol 14.2.1 beta发布

    已经快到2015 年了. 14.2.1 beta 才出来了. 还好,有一些新东西. 官网地址 VCL Gauge Control Designed to clearly convey informat ...

  6. 2018.06.30 BZOJ1026: [SCOI2009]windy数(数位dp)

    1026: [SCOI2009]windy数 Time Limit: 1 Sec Memory Limit: 162 MB Description windy定义了一种windy数.不含前导零且相邻两 ...

  7. 2018.08.15 bzoj3747: [POI2015]Kinoman(线段树)

    传送门 简单题. 先不管时间复杂度看看怎么做. 对于一段区间[l,r],如果从右端加入一个数a[r+1],对这个区间有什么影响?显然如果区间中已经有了a[r+1]这个数就会产生-a[i+1]的影响,否 ...

  8. [VC++入门]指针一

    俗话说没有搞清楚指针就没有学会C/C++,所以指针是一个相当重要的东东,相当年在用 C#调用C++写的动态链接库时,以为C++中的指针就是C#中的引用类型(ref),但是看了一下却不是这样.指针当然和 ...

  9. HDU 2136 Largest prime factor (素数打表。。。)

    题意:给你一个数,让你求它的最大因子在素数表的位置. 析:看起来挺简单的题,可是我却WA了一晚上,后来终于明白了,这个第一层循环不是到平方根, 这个题和判断素数不一样,只要明白了这一点,就很简单了. ...

  10. 关于this对象

    1.在全局函数中this指的是window 2.当函数被当做方法调用时,this等于那个对象 3.匿名函数具有全局性,只要是匿名函数,this指向window 实例1: var name = 'the ...