Problem:
Score : 600 points

Problem Statement

You are given a positive integer N.
Find the number of the pairs of integers u and v (0≦u,v≦N) such that there exist two non-negative integers a and b satisfying a xor b=u and a+b=v.
Here, xor denotes the bitwise exclusive OR.
Since it can be extremely large, compute the answer modulo 10^9+7.

Constraints

1≦N≦10^{18}

Input

The input is given from Standard Input in the following format:

N

Output

Print the number of the possible pairs of integers u and v, modulo 10^9+7.

Sample Input 1

3

Sample Output 1

5

The five possible pairs of u and v are:

u=0,v=0 (Let a=0,b=0, then 0 xor 0=0, 0+0=0.)

u=0,v=2 (Let a=1,b=1, then 1 xor 1=0, 1+1=2.）

u=1,v=1 (Let a=1,b=0, then 1 xor 0=1, 1+0=1.）

u=2,v=2 (Let a=2,b=0, then 2 xor 0=2, 2+0=2.）

u=3,v=3 (Let a=3,b=0, then 3 xor 0=3, 3+0=3.）

Sample Input 2

1422

Sample Output 2

52277

Sample Input 3

1000000000000000000

Sample Output 3

787014179

Solution in C# (Mono 4.6.2.0) (judge verdict: Accepted)

using System;
using System.Collections.Generic;
class Program
{
	static void Main(string[] args)
	{
		long N = long.Parse(Console.ReadLine());
		long mod = 1000000007;
		long[,]D = new long[60,3];
		D[59,2] = 1;
		long Na = 0;
		if(N>=(long)Math.Pow(2,59)){
			D[59,1] = 1;
			Na += (long)Math.Pow(2,59);
		}
		for(var i=58;i>=0;i--){
          	if(N >= Na + (long)Math.Pow(2,i)){
				D[i,0] = D[i+1,0]*3+D[i+1,1]*2;
				D[i,1] = D[i+1,1]*1+D[i+1,2];
				D[i,2] = D[i+1,2];
              	Na += (long)Math.Pow(2,i);
			} else {
				if(N >= (long)Math.Pow(2,i)*2){
                 	D[i,0] = D[i+1,0]*3+D[i+1,1];
					D[i,1] = D[i+1,1];
					D[i,2] = D[i+1,1]+D[i+1,2];
				} else if(N >= (long)Math.Pow(2,i)){
                 	D[i,0] = D[i+1,0];
					D[i,1] = D[i+1,1]+D[i+1,2];
					D[i,2] = D[i+1,2];
                  	Na += (long)Math.Pow(2,i);
				} else {
					D[i,0] = D[i+1,0];
 	                D[i,1] = D[i+1,1];
    	            D[i,2] = D[i+1,2];
                }
			}
			D[i,0] %= mod;
			D[i,1] %= mod;
			D[i,2] %= mod;
		}
		Console.WriteLine((D[0,0]+D[0,1]+D[0,2])%mod);
	}
}