#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
const int mod=1000000007;
int dp[2][2][2];
int main()
{
	long long n;
	int now=0,to=1,nv,rv,h;
	scanf("%lld",&n);
	memset(dp,0,sizeof(dp));
	dp[now][0][0]=1;
	for(int i=0;i<=59;i++)
	{
		for(int j=0;j<2;j++)
			for(int k=0;k<2;k++)
				if(dp[now][j][k])
				{
					nv=((n>>i)&1);
					for(int z=0;z<3;z++)
					{
						rv=((z+k)&1);
						h=(z+k)>>1;
						if(rv<nv)
							(dp[to][0][h]+=dp[now][j][k])%=mod;
						else if(rv==nv)
							(dp[to][j][h]+=dp[now][j][k])%=mod;
						else if(rv>nv)
							(dp[to][1][h]+=dp[now][j][k])%=mod;
					}
					dp[now][j][k]=0;
				}
		swap(now,to);
	}
	printf("%d",dp[now][0][0]);
	return 0;
}