rt,第三组样例代码一直输出 499791830。
#include<bits/stdc++.h>
#define int long long
using namespace std;
long long mier[65]= {1,2,4,8,
16,32,64,
128,256,512,
1024,2048,4096,
8192,16384,32768,
65536,131072,262144,
524288,1048576,2097152,
4194304,8388608,16777216,
33554432,67108864,134217728,
268435456,536870912,1073741824,
2147483648,4294967296,8589934592,
17179869184,34359738368,68719476736,
137438953472,274877906944,549755813888,
1099511627776,2199023255552,4398046511104,
8796093022208,17592186044416,35184372088832,
70368744177664,140737488355328,281474976710656,
562949953421312,1125899906842624,2251799813685248,
4503599627370496,9007199254740992,18014398509481984,
36028797018963968,72057594037927936,144115188075855872,
288230376151711744,576460752303423488,1152921504606846976,2305843009213693952
};
long long n,m;
int get2(long long x) {
for(int i=0; i<=60; i++) {
if(mier[i]>x)return i;
}
}
int n2,m2,m_[64];
long long ans=0;
signed main() {
cin>>n>>m;
n2=get2(n);
m2=get2(m);
// cout<<n2<<' '<<m2<<endl;
int _=-1;
while(m) {
m_[++_]=m%2;
m=m/2;
}
int cc;
cc=min(n2,m2);
for(int i=0; i<cc; i++) {
if(m_[i]==1) {
ans+=((long long)((n/mier[i+1])%998244353)*(mier[i]%998244353))%998244353;
ans%=998244353;
if((n%mier[i+1])>mier[i])ans+=(((n%mier[i+1])%998244353)-(mier[i]%998244353))%998244353;
ans%=998244353;
}
}
cout<<ans;
return 0;
}