https://ac.nowcoder.com/acm/contest/3004/E
1 #include<bits/stdc++.h> 2 using namespace std; 3 const long long mod=(int)1e9+7; 4 int i,i0,T; 5 long long cnta[70],cntb[70],dp[70][70][2],a[70]; 6 long long dfs(int len,bool maxi,int k,bool f) 7 { 8 if(dp[len][k][f]!=-1&&!maxi) return dp[len][k][f]; 9 if(!len) return f; 10 long long cnt=0; 11 int limit=maxi?a[len]:1; 12 for(int i=0;i<=limit;i++){ 13 cnt+=dfs(len-1,maxi&&a[len]==i,k,f||len==k&&i); 14 } 15 return maxi?cnt:dp[len][k][f]=cnt; 16 } 17 long long div(long long tmp,int k) 18 { 19 memset(a,0,sizeof(a)); 20 int p=0; 21 while(tmp)a[++p]=tmp%2,tmp/=2; 22 return dfs(p,1,k,0); 23 } 24 long long inv(long long x,long long mod) 25 { 26 long long k=mod-2,ans=1; 27 while(k) 28 { 29 if (k&1) ans=ans*x%mod; 30 x=x*x%mod; 31 k>>=1; 32 } 33 return ans; 34 } 35 int main() 36 { 37 memset(dp,-1,sizeof(dp)); 38 scanf("%d",&T); 39 while(T--){ 40 long long l1,r1,l2,r2,p=1,ans=0; 41 scanf("%lld %lld %lld %lld",&l1,&r1,&l2,&r2); 42 l1--,l2--; 43 for(i=1;i<=60;i++,p*=2){ 44 cnta[i]=div(r1,i)-div(l1,i); 45 cntb[i]=div(r2,i)-div(l2,i); 46 ans+=(cnta[i]%mod*((r2-l2-cntb[i])%mod)%mod+cntb[i]%mod*((r1-l1-cnta[i])%mod)%mod)*(p%mod)%mod; 47 ans%=mod; 48 } 49 ans%=mod,ans+=mod,ans%=mod; 50 ans=ans*inv(((r1-l1)%mod)*((r2-l2)%mod)%mod,mod)%mod; 51 printf("%lld\n",ans); 52 } 53 return 0; 54 }