#pragma GCC optimize("Ofast,unroll-loops") #pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt") #include #include // #include // #include #define rep(i,a,b) for(int i=(a);i<(b);i++) #define rrep(i,a,b) for(int i=(b)-1;i>=(a);i--) #define all(x) begin(x),end(x) #define sz(x) (int)(x).size() using namespace std; using namespace atcoder; using ll=long long; using ull=unsigned long long; using ld=long double; using vll=vector; using vvll=vector; using vi=vector; using vvi=vector; using pll=pair; using pi=pair; // using mint=modint998244353; using mint=modint1000000007; // using mint2=static_modint<2>; // using BoostPoint=boost::polygon::point_data; // using Voronoi=boost::polygon::voronoi_diagram; // using mint=LazyMontgomeryModInt<998244353>; using vm=vector; // using vvm=vector; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); /** * F(n) = \sum_{x=0}^{n-1} x * popcnt(x) * G(n) = \sum_{x=0}^{n-1} popcnt(x) * とする * * 答えは F(N+1)。 * * popcnt(2x)=popcnt(x) * popcnt(2x+1)=popcnt(x)+1 * を用いて * * F(2n) を考察する * 2x と 2x+1 の寄与は * 2x*popcnt(2x) + (2x+1)popcnt(2x+1) * = 4xpopcnt(x) + popcnt(x) + 2x + 1 * * 和を取れば以下の再帰式が得られます * F(2n) = 4F(n) + G(n) + n^2 * G(2n) = 2G(n) + n * * さらに(明らかですが) * F(2n+1) = F(2n) + 2n*popcnt(n) * G(2n+1) = G(2n) + popcnt(n) * * よって、ダブリングなどを使えばO(logN)で解けます */ ull N; cin>>N; N++; const ll MOD=1000000007; ll n=0,F=0,G=0; int p=0; rrep(k,0,bit_width(N)){ int b=(N>>k)&1; int f=(4*F+G+n*n+2*b*n*p)%MOD; int g=(2*G+n+b*p)%MOD; F=f; G=g; n=2*n+b; if(n>=MOD)n-=MOD; p+=b; } cout<