题意:
定义
s
u
m
(
i
)
sum(i)
sum(i)为数字i的二进制表示中1的个数,
现在给定n,要求计算
∏
i
=
1
n
s
u
m
(
i
)
\prod_{i=1}^nsum(i)
∏i=1nsum(i),
答案对1e7+7取模
数据范围:n<=1e15
解法:
第一眼思路是枚举1的个数,
计算出每种的方案数即可.
方案数用数位dp做.
code:
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxm=1e6+5;
const int mod=1e7+7;
int ppow(int a,int b,int mod){
int ans=1%mod;a%=mod;
while(b){
if(b&1)ans=ans*a%mod;
a=a*a%mod;
b>>=1;
}
return ans;
}
int digit[66];
int d[66][66];
int k;
int dfs(int len,int limit,int cnt){
if(!len)return cnt==k;
if(cnt>k)return 0;
if(!limit&&d[len][cnt]!=-1)return d[len][cnt];
int ma=(limit?digit[len]:1);
int ans=0;
for(int i=0;i<=ma;i++){
ans+=dfs(len-1,limit&&i==ma,cnt+i);
}
if(!limit)d[len][cnt]=ans;
return ans;
}
void solve(int x){
int len=0;
while(x){
digit[++len]=x%2;
x/=2;
}
int ans=1;
for(int i=1;i<=60;i++){
k=i;
memset(d,-1,sizeof d);
int t=dfs(len,1,0);
ans=ans*ppow(i,t,mod)%mod;
}
cout<<ans<<endl;
}
signed main(){
int n;cin>>n;
solve(n);
return 0;
}