2020算法设计竞赛

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 }

猜你喜欢

转载自www.cnblogs.com/pangbi/p/12288058.html
今日推荐