小数据打表之后找规律,,
发现了规律是
https://www.jisuanke.com/contest/876/44180
F题
也可以参考http://blog.youkuaiyun.com/tzc_anruoxin/article/details/78005515
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<string>
#include<algorithm>
#include<set>
using namespace std;
const int maxn = 100;
typedef long long ll;
typedef vector<ll> vec;
typedef vector<vec> mat;
const ll mod= 1e9+7;
ll a[maxn];
ll Pow[maxn];
void init(){
a[0]=1;
Pow[0]=1;
for(ll i=1;i<=62;i++){
a[i]=a[i-1]*2;
Pow[i]=(a[i]%mod)*(a[i]%mod)%mod;
// cout<<i<<' '<<a[i]<<' '<<Pow[i]<<endl;
}
}
ll ans(ll x){
ll sum=0;
ll n=x;
for(ll j=0;(1LL<<j)<=x;j++){
ll temp=(x>>(j+1));
if(x&(1LL<<j)) temp++;
// cout<<temp<<' '<<Pow[j]+1<<endl;
temp=(temp%mod)*(Pow[j]+1)%mod;
sum=(sum+temp)%mod;
}
ll sub=0;
for(int i=0;i<=62;i++){
if(x>=a[i]) {
ll c1=(a[i]%mod);
ll c2=(a[i]/2)%mod;
sub=((sub+(c1*c1-c2*c2))%mod+mod)%mod;
// cout<<"-------"<<(a[i]*a[i]-a[i]*a[i]/4)<<endl;
}
else break;
}
sum=(sum+mod-sub)%mod;
return sum;
}
int main(){
init();
ll n;
while(cin>>n){
cout<<ans(n-1)<<endl;
}
return 0;
}