数位DP…
感觉已经被数位DP虐习惯了…
#include <cstdio>
typedef long long ll;
const ll N=101;
const ll TOMOD=10000007;
ll a,len,Ans=1;
ll b[N],ans[N];
ll f[N][N];
void cal(ll x,ll tag){
if(x==1){
if(b[x]) ans[tag+1]++;
ans[tag]++;
return ;
}
if(!b[x]){
cal(x-1,tag);
return ;
}
for(ll i=0;i<=x-1;i++) ans[i+tag]+=f[x-1][i];
cal(x-1,tag+1);
}
ll qpow(ll x,ll p){
if(!p) return 1;
ll y=qpow(x,p>>1);
y=(y*y)%TOMOD;
if(p&1) y=(y*x)%TOMOD;
return y;
}
int main(){
scanf("%lld",&a);
while(a){
b[++len]=a&1;
a>>=1;
}
f[1][0]=f[1][1]=1;
for(ll i=2;i<=len;i++){
for(ll j=0;j<=len;j++){
f[i][j]=f[i-1][j];
if(j) f[i][j]+=f[i-1][j-1];
}
}
cal(len,0);
for(ll i=1;i<=len;i++) Ans=(Ans*qpow(i,ans[i]))%TOMOD;
printf("%lld\n",Ans);
return 0;
}