#2957. 春游

春游

题目描述

小虾被定为了春游活动的组织员,他需要从班里选出一些人进行合作。

具体地,小虾的班里每个人的编号为一个非负整数(可以很大),每个非负整数对应恰好一个同学。每次他会选两名同学,假设这两名同学的编号分别为 xxyy。如果 x,yx,y 满足 l((x&y)+(xy))rl\leq ((x\&y)+(x|y))\leq r,则称这两名同学相配。

注: &,\&,| 分别为 按位与 和 按位或。如果对这个不清楚,可以查看下方的提示说明部分。

小虾想问你,问有多少对相配的同学(顺序不同算两种,x,yx,y 可以相同)?

输入格式

共一行,两个非负整数 l,rl,r

输出格式

共一行,一个非负整数 ansans,表示答案对于 998244353998244353 取模的结果。

样例 1

输入

1 1

输出

2

解释

一组满足条件的 xxyy 分别为 1100

计算可得 (x&y)=0(x\&y)=0,继续计算得到 (xy)=1(x|y)=1,所以 (x&y)+(xy)=1(x\&y)+(x|y)=1,满足条件。

另一组满足条件的 xxyy 即为上文的 xxyy 交换。

样例 2

输入

114 191

输出

11973

样例 3

该样例符合测试点 7107\sim 10 的限制。

输入

见下发文件中的prilov3.in

输出

见下发文件中的 prilov.out

样例 4

该样例符合测试点 111211\sim 12 的限制。

输入

见下发文件中的 prilov\prilov4.in

输出

见下发文件中的 prilov\prilov4.out

数据范围与提示

数据编号 特殊性质
121\sim 2 l,r4l,r\leqslant 4
343\sim 4 l,r8l,r\leqslant 8
565\sim 6 l=rl=r
7107\sim 10 l,r1000l,r\leqslant 1000
111211\sim 12 l,r109l,r\leqslant 10^9
132013\sim 20 无特殊性质

对于 100%100\% 的数据,满足 0lr10180\leqslant l\leqslant r\leqslant 10^{18}

关于位运算

求一个数 aa 的二进制,即 (a)2(a)_2,可以通过以下 C++ 代码获取。

#include<iostream>
#include<string>
#include<cstring>
using namespace std;
int x;
string fun(int x)
{
	string result="";
	for(int i=30;i>=0;i--)
	{
		int w=1;
		for(int j=1;j<=i;j++)
		 w*=2;
		if(x>=w)
		{
			x-=w;
			result="1"+result;
		}
		else
		{
			result="0"+result;
		}
	}
	return result;
}
int main()
{
	cin>>x;
	cout<<fun(x)<<endl;
}

即通过贪心获取。(a&b)(a\&b) 的结果的某一位是 11 仅当 aabb 的这一位上都为 11,否则为 00(ab)(a|b) 的结果的某一位是 00 仅当 aabb 的这一位上都为 00,否则为 11

下面这个代码会分别输出 (a&b)(a\&b)(ab)(a|b) 二进制下的结果。

#include<iostream>
#include<string>
#include<cstring>
using namespace std;
int a,b;
string fun(int a)
{
	string result="";
	for(int i=30;i>=0;i--)
	{
		int w=1;
		for(int j=1;j<=i;j++)
		 w*=2;
		if(a>=w)
		{
			a-=w;
			result="1"+result;
		}
		else
		{
			result="0"+result;
		}
	}
	return result;
}
int main()
{
	cin>>a>>b;
	cout<<fun(a&b)<<endl<<fun(a|b)<<endl;
}