傳送門
這個很簡單啊…
回憶一下數位
d
p
dp
dp吧,以前學的太快了,都忘記了.
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int mod = 10000007;
int n,a[65],f[65][65][2];
int quick(int x,int n)
{
int ans = 1;
for( ; n ; n>>=1,x = x*x%mod)
if( n&1 ) ans = ans*x%mod;
return ans;
}
int dfs(int len,int limit,int yu)
{
if( yu<0 || len<yu ) return 0;
if( len==0 ) return ( yu==0 );
if( f[len][yu][limit]!=-1 ) return f[len][yu][limit];
int last = limit?a[len]:1, ans = 0;
for(int i=0;i<=last;i++)
ans += dfs(len-1,limit&&(i==a[len]),yu-(i==1) );
return f[len][yu][limit] = ans;
}
void solve(int n)
{
memset(a,0,sizeof(a));
while( n )
{
a[++a[0]] = ( n&1 );
n>>=1;
}
}
signed main()
{
memset( f,-1,sizeof(f) );
cin >> n;
solve(n);
int ans = 1;
for(int i=1;i<=63;i++)
ans = ans*quick( i,dfs(a[0],1,i) )%mod ;
cout << ans;
}