#1#2#3没问题
后面7个点全部输出0
link
求条
#include<bits/stdc++.h>
#define MOD 10000007
using namespace std;
long long dp[55][55][55],b[55];
long long ksm(long long d,long long m){
if(m==0)return 1;if(m==1)return d;if(m==2)return (d%MOD*d%MOD);
if(m%2)return (d%MOD*ksm(d*d,m/2)%MOD)%MOD;
return ksm((d%MOD*d%MOD)%MOD,m/2)%MOD;
}
long long dfs(int pos,bool is_max,int f,int sum){
if(pos==0)return f==sum;
if(!is_max && dp[pos][f][sum]!=-1)return dp[pos][f][sum];
long long ans=0,end=(is_max? b[pos] :1);
for(int i=0;i<=end;i++){
long long t=dfs(pos-1,is_max&&i==end,f+i,sum);
ans=ans+t;
}
if(!is_max)dp[pos][f][sum] = ans;
return ans;
}
unsigned long long solve(long long x){
int len=0;
for(int i=0;i<=54;i++){
for(int j=0;j<=54;j++){
for(int k=0;k<=54;k++){
dp[i][j][k] = -1;
}
}
}
for(int i=0;i<=54;i++){
b[i] = 0;
}
for(;x>0;x/=2){
b[++len]=x%2;
}
unsigned long long ans=1;
for(int i=1;i<=len;i++){
// cout<<dfs(len,1,0,i)<<' '<<i<<'\n';
ans=(ans%MOD*ksm(i,dfs(len,1,0,i))%MOD)%MOD;
}
return ans;
}
long long N;
int main(){
cin>>N;
cout<<solve(N);
return 0;
}