Solution P11955 「ZHQOI R1」覆盖
UniGravity · · 题解
这个题很人类智慧啊!
首先考虑
如上图。由于某个区间不能包含三个相邻的同层节点(否则就会合并成一个大的),因此
考虑上图的这种构造方式,首先每个
设
解决了特殊性质 AB 后,考虑拓展这个做法。例如从
这是完全包含的情况,不完全包含的情况(即要求
场上写的
const int P=353442899;
int pw[80];
il int count(int x){
if(!x)return 0;
int ans=x;
forto(i,1,61){
int l=1ll<<i,r=(1ll<<(i+1))-1;if(l>x)break;
if(r<=x){
if(i>1){
ans+=(__int128)pw[i]%P*(r-l+1)%P,ans%=P;
int d=1ll<<(i-1);
ans+=(__int128)(r-l+r-l-d+1)*d/2%P,ans%=P;
}else if(i==1)ans+=5;
}else{
if(i>1){
// cerr<<l<<' '<<x<<' '<<pw[i]<<'\n';
ans+=(__int128)pw[i]%P*(x-l+1)%P,ans%=P;
int d=min(1ll<<(i-1),x-l);//cerr<<d<<'\n';
ans+=(__int128)(x-l+x-l-d+1)*d/2%P,ans%=P;
}else if(i==1)ans+=2;
}
}
return ans;
}
il void work(){
int l=read(),r=read();
printf("%lld\n",(count(r)-count(l-1)+P)%P);
}
signed main(){
pw[0]=0,pw[1]=2;
forto(i,2,60)pw[i]=(pw[i-1]+(1ll<<(i-2))+1)%P;
// forto(i,1,60)cerr<<pw[i]<<'\n';
int t=read();while(t--)work();
return 0;
}