传送门biu~
令
ani
a
n
i
代表二进制中
1
1
的个数为的数有多少个。从高位向低位枚举,假设输入的数
n
n
的二进制第位为
1
1
,那么设一个数的第
i
i
位为,前
i−1
i
−
1
位与
n
n
相同,那么无论比位低的数位中哪一位为
1
1
,都不会大于
n
n
,所以可以用组合数更新答案。
Ps:
φ(10000007)=9988440
φ
(
10000007
)
=
9988440
说得不清楚看代码:
#include<bits/stdc++.h>
using namespace std;
const long long mod=10000007,phi=9988440;
long long n,ans=1;
long long c[51][51],an[51];
int a[51],now,cnt;
inline void getC(){
for(int i=0;i<=50;++i){
c[i][0]=1;
for(int j=1;j<=i;++j) c[i][j]=c[i-1][j]+c[i-1][j-1];
}
}
inline long long ksm(long long p,long long n){
long long re=1;
while(n){
if(n&1) re=re*p%mod;
p=p*p%mod;
n>>=1;
}
return re;
}
int main(){
scanf("%lld",&n);
getC();
while(n){a[++cnt]=n&1;n>>=1;}
for(int i=cnt;i>=1;--i){
if(!a[i]) continue;
for(int j=1;j<i;++j) an[now+j]+=c[i-1][j];
++an[++now];
}
for(int i=1;i<=cnt;++i) (ans*=ksm(i,an[i]%phi))%=mod;
printf("%lld",ans);
return 0;
}