Solution P11799 【MX-X9-T3】『GROI-R3』Powerless
UniGravity · · 题解
提供一种没啥思维难度的做法,理清思路后也并不算难写。
记
先考虑如何判断
考虑对于
记
假设
这样我们就可以做到
最后还要算上与自己相同值的贡献,因此一开始需要对
const int N=200005,P=998244353;
int n,m,a[N],tmp[N],c[N],s[N];
il int findr(int l,int v,int k){
int r=n,mid,ans=1;
while(l<=r){
mid=(l+r)>>1;
if((a[mid]>>k)==(v>>k))ans=mid,l=mid+1;
else r=mid-1;
}
return ans;
}
il int findl(int r,int v,int k){
int l=1,mid,ans=n;
while(l<=r){
mid=(l+r)>>1;
if((a[mid]>>k)==(v>>k))ans=mid,r=mid-1;
else l=mid+1;
}
return ans;
}
il int c1(int p,int v,int m){
int ans=0;
if(v==1){
ans=(m>>(p+1))*(1<<p);
if((m>>p)&1)ans+=m&((1<<p)-1),ans++;
}else{
if((m>>p)&1)ans=((m>>(p+1))+1)*(1<<p);
else ans=(m>>(p+1))*(1<<p),ans+=m&((1<<p)-1),ans++;
}
return ans;
}
il int count(int p1,int v1,int p2,int v2){
if(p1==p2){
if(v1!=v2)return 0;
else return c1(p1,v1,m);
}else if(p2>p1)return count(p2,v2,p1,v1);
int ans=0;
if(v1){
ans=(m>>(p1+1))*(1<<(p1-1));
if((m>>p1)&1)ans+=c1(p2,v2,m&((1<<p1)-1));
}else{
if((m>>p1)&1)ans=((m>>(p1+1))+1)*(1<<(p1-1));
else{
ans=(m>>(p1+1))*(1<<(p1-1));
ans+=c1(p2,v2,m&((1<<p1)-1));
}
}
return ans;
}
signed main(){
int n1=read();n=0,m=read();tmp[0]=-1;
forto(i,1,n1)tmp[i]=read();sort(tmp+1,tmp+n1+1);
forto(i,1,n1)if(tmp[i]==tmp[i-1])c[n]++;else a[++n]=tmp[i],c[n]=1;
forto(i,1,n)s[i]=s[i-1]+c[i];
int l,r,ans=0,cnt;
forto(i,1,n){
forv(k,31){
if(!((a[i]>>k)&1)){
l=findr(i,a[i],k)+1,r=findr(i,a[i],k+1);if(l>r)continue;
forv(k1,31)ans+=1ll*count(k,0,k1,((a[i]>>k1)&1)^1)*(1ll<<k1)%P*(s[r]-s[l-1])%P*c[i]%P,ans%=P;
}else{
l=findl(i,a[i],k+1),r=findl(i,a[i],k)-1;if(l>r)continue;
forv(k1,31)ans+=1ll*count(k,1,k1,((a[i]>>k1)&1)^1)*(1ll<<k1)%P*(s[r]-s[l-1])%P*c[i]%P,ans%=P;
}
}
}
ans=2*ans%P;
forto(i,1,n)forv(k,31)ans=(ans+1ll*c[i]*c[i]%P*c1(k,((a[i]>>k)&1)^1,m)%P*(1<<k)%P)%P;
printf("%lld\n",ans);
return 0;
}