按位计算。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define maxn 60 #define mod1 10000007 #define mod2 9988440 using namespace std; long long n,bit[maxn],ret=0,c[maxn][maxn]; void get_bit() { long long rt=n; while (rt) { bit[++ret]=rt&1; rt>>=1; } } void get_table() { c[0][0]=1; for (long long i=1;i<=50;i++) { c[i][0]=1; for (long long j=1;j<=i;j++) c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod2; } } long long f_pow(long long x,long long y) { long long ans=1,base=x; while (y) { if (y&1) ans=(ans*base)%mod1; base=(base*base)%mod1; y>>=1; } return ans; } int main() { scanf("%lld",&n); get_bit();get_table(); long long ans=1,rets=0; for (long long i=ret;i>=1;i--) { if (!bit[i]) continue; for (long long j=0;j<=i-1;j++) { if ((!j) && (!rets)) continue; ans=(ans*f_pow(rets+j,c[i-1][j]))%mod1; } rets++; } ans=(ans*rets)%mod1; printf("%lld\n",ans); return 0; }