原因是 列表后接标题行或行间代码时,中间应留有空行;
此篇题解是为补充前两位大佬(均为排名前200的超级大犇)的题解。毕竟人家和本蒟不在同一水平,简单说几句就以为我这样的小蒟蒻能一下搞懂找到门路(嘤嘤嘤)。
给你 n 和 m,求 1 到 n 所有的数异或上 1 到 m 所有的数结果相加的总和。
为了偷懒,本蒟把 now 定义为了 2now,用 i 来枚举当前的位置,观看时请务必注意。
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int M=998244353;
int t,cnt[33][3];
int times(int x,int y)
{
return ((x%M)*(y%M))%M;
}
int pl(int x,int y)
{
return ((x%M+y%M)%M+M)%M;
}
inline int read()
{
int f=1,k=0;
char c=getchar();//读入一个字符
//非数字
while(c<'0'||c>'9')//读到空格后
{
if(c=='-')f=-1;//读到负数
c=getchar();//两个功能:读取负号后面的数字或者读入空格等。
}
//数字
while(c>='0'&&c<='9')
{
k=(k<<1)+(k<<3)+(c^48);
c=getchar();//一位一位读入数字
}
return f*k;
}
signed main()
{
t=read();
while(t--)
{
int n=read(),m=read(),ans=0,now=1;
memset(cnt,0,sizeof(cnt));
for(register int i=0;(1ll<<i)<=max(n,m);i++)
{
int f=now<<1;
cnt[i][1]=(now<=n?(now*(n/f)+(n%f+1>=now?(n%f-now+1):0)):0);//1~n第i位几个数值位1
cnt[i][2]=(now<=m?(now*(m/f)+(m%f+1>=now?(m%f-now+1):0)):0);//1~m第i位几个数值位1
ans=pl(ans,times(now,pl(times(cnt[i][1],(m-cnt[i][2])),times(cnt[i][2],n-cnt[i][1]))));
now<<=1;
}
cout<<ans<<endl;
}
return 0;
}
最后提醒大家时刻不要忘记模 998244353!完结撒花!感谢观看!