`
设 f
( x
) 是 x
的二进制对数的底数。换句话说, f
( x
) 是最大的非负整数 y
,使得 2y
不超过 x
。
设 g
( x
)是以 f
( x
)为底的{7385241}的对数的底。换句话说, g
( x
) 是最大的非负整数 z
,使得 f(x)z
不超过 x
。
给你 q
个查询。其中 i
-th 查询由两个整数 li
和 ri
组成。查询的答案是所有整数 k
中 g
( k
)的和,即 li≤k≤ri
。由于答案可能很大,因此打印它们的模数 109+7
。
#include "bits/stdc++.h"
using namespace std;
typedef long long ll;
ll mod=1e9+7;
ll cal(ll x){ //前缀
ll ans=0;
for(ll i=4; i<=x; i<<=1){
ll gx=0, ma=min(x, i*2-1);
__int128 now=1;
while(now<=i) gx++, now*=__lg(i); // *f(x),直到now>i, now==2^(k+1),此时cnt表示乘了多少次f(x),也就是g(x)+1
if(now>ma) ans+=(ma-i+1)%mod*(gx-1)%mod; //只有一个取值,那就gx*区间
else{ //有两个取值
ll t=ma-now+1; //t个g(x)+1
t%=mod;
ans+=t*gx%mod+(now-i)%mod*(gx-1); // (i ~ now-1)个gx
}
}
return ans%mod;
}
void solve(){
ll l, r; cin>>l>>r;
cout<<(cal(r)-cal(l-1)+mod)%mod<<'\n';
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
ll T=1;
cin>>T;
while(T--){
solve();
}
return 0;
}
`