版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fanbaobao829/article/details/82253501
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
ll ans,sum,inv2=500000004;
ll cal(ll n)
{
sum=0;
while(n)
{
sum+=n;
n>>=1;
}
return sum;
}
void calc(ll n)
{
ll tp=1;
sum=ans=0;
while(n)
{
sum+=n;
ans=(ans+n%mod*((n+1)%mod)%mod*inv2%mod*tp%mod)%mod;
tp=tp*2%mod;
n>>=1;
}
}
int main()
{
ll t,n;
scanf("%lld",&t);
while(t--&&scanf("%lld",&n)!=EOF)
{
sum=ans=0;
ll l=1,r=n;
while(l<r)
{
ll mid=(l+r)/2;
if(cal(mid)>=n-1)
r=mid;
else
l=mid+1;
}
calc(l);
printf("%lld\n",((ans-(sum-n+1)%mod*(l%mod)%mod)%mod+mod+1)%mod);
}
return 0;
}