// Problem: D - Masked Popcount
// Contest: AtCoder - AtCoder Beginner Contest 356
// URL: https://atcoder.jp/contests/abc356/tasks/abc356_d
// Memory Limit: 1024 MB
// Time Limit: 2000 ms
//
// Powered by CP Editor (https://cpeditor.org)
#include<bits/stdc++.h>
#define ll long long
#define mod 998244353
#define N 1005
using namespace std;
ll read(){
ll x=0,f=1;char ch=getchar();
while(ch<'0' || ch>'9')f=(ch=='-'?-1:1),ch=getchar();
while(ch>='0' && ch<='9')x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return x*f;
}
void write(ll x){
if(x<0)x=-x,putchar('-');
if(x/10)write(x/10);
putchar(x%10+'0');
}
ll qp(ll x,ll y){
ll ans=1;while(y){if(y&1)ans=(ans*x)%mod;x=(x*x)%mod;y>>=1;}return ans;
}
int main(){
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
ll n=read(),m=read(),tmpn=n;
if(n==0){
cout<<0;return 0;
}
if(n==1){
cout<<(m&1);
return 0;
}
ll alr=0,res=0;
while(n){
ll p=__lg(n),cnt=p;p=(1ll<<p);
if(p==1){res+=2*alr;if(m&1)res++;res%=mod;break;}
for(ll j=1;j<p;j<<=1){
if(!(m&j))continue;
res=(res+qp(2,cnt-1))%mod;
}
res+=(p%mod)*(alr)%mod;res%=mod;
if(p&m)alr++;n-=p;
}
if(tmpn%2==0)res+=__builtin_popcount(tmpn&m),res%=mod;
write(res);
return 0;
}
rt,调了一整场,赛后也一直再和题解拍,想问下哪里有问题/ll