rt,感觉时间复杂度是对的,但是 TLE 了5个点,求调
#include<bits/stdc++.h>
#define int long long
#define mod 10000007
using namespace std;
int n,ans=1,len,a[55],f[55][55];
int power(int x,int y,int p)
{
int ans=1;
while(y)
{
if(y%2)ans=ans*x%p;
y/=2;
x=x*x%p;
}
return ans%p;
}
int dfs(bool limit,int pos,int sum,int num)
{
if(pos==0)return sum==num;
if(!limit&&f[pos][sum])return f[pos][sum];
int res=0;
int up=limit?a[pos]:1;
for(int i=0;i<=up;i++)res+=dfs(limit&(i==a[pos]),pos-1,sum+(i==1),num);
if(!limit)f[pos][sum]=res;
return res;
}
int ask(int k,int num)
{
len=0;
while(k)
{
a[++len]=k%2;
k/=2;
}
memset(f,0,sizeof(f));
return dfs(1,len,0,num);
}
signed main()
{
scanf("%lld",&n);
for(int i=1;i<=50;i++)ans=ans*power(i,ask(n,i),mod)%mod;
printf("%lld",ans);
return 0;
}