题目传送门
思维难度:蓝+
代码难度:红
这题思维很毒,logn都过不了
题意简述:
求:
思路:
对两个数i,j不妨设i>j,令h=i^j,则j最高位不能为i的最高位,否则h<j,当满足这一条件时,h一定大于j
其次,要让h<i,那只要对i取第二位,j在此取最高位,后面随便取,那么它代表的正好是该位所代表的数字
code:
#include<bits/stdc++.h>
#define int long long
using namespace std;
int q[101],n,b[101],ans,t,l;
const int mod=1000000007,inv=500000004;
inline int js(int x){
return (((((x+1)%mod)*x)%mod)*inv)%mod;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
b[1]=1;
for(int i=2;i<64;++i){
b[i]=b[i-1]<<1;
q[i]=js(((1ll<<(i-1))-1)%mod);
q[i]=(q[i]+q[i-1])%mod;
}
cin>>t;
while(t--){
cin>>n;
int i;
for(i=63;i>=1;--i){
if(n>b[i])break;
}
n-=(1ll<<(i-1));
ans=(q[i-1]+js(n%mod))%mod*2%mod;
cout<<ans<<"\n";
}
return 0;
}
求互关和三连(✪ω✪)