2 条题解
-
0
#include<bits/stdc++.h> #define LL long long using namespace std; const LL mod=1e8+7; LL qpow(LL a, LL b) { LL res=1; for(a%=mod;b;b>>=1,a=a*a%mod)if(b&1)res=res*a%mod; return res; } LL f[70][70],c[70],d[70]; //f[i][j]表示i位含j个1的方案数 //c[i]表示有i个1的数有多少个 int main() { int D=log2(1e15)+1; d[0]=1;for(int i=1;i<=D;i++)d[i]=d[i-1]*2; for(int i=0;i<=D;i++)f[i][0]=1; for(int i=1;i<=D;i++)for(int j=1;j<=i;j++)f[i][j]=f[i-1][j-1]+f[i-1][j]; LL n,t=0;scanf("%lld",&n); n=(n+1)/2; for(int i=D;i>=0;i--) { if(n>=d[i]) { n-=d[i]; t++; for(int j=0;j<=i;j++)c[t+j]+=f[i][j]; } } LL ans=1; for(int i=1;c[i];i++)ans=ans*qpow(i,c[i])%mod; printf("%lld\n",ans); return 0; } -
0
#include<bits/stdc++.h> #define LL long long using namespace std; const LL mod=1e8+7; LL qpow(LL a,LL b) { LL res=1; for(a%=mod;b;b>>=1,a=a*a%mod)if(b&1)res=res*a%mod; return res; } LL f[70][70],c[70],d[70]; //f[i][j]表示i位含j个1的方案数 //c[i]表示有i个1的数有多少个 int main() { int D=log2(1e15)+1; d[0]=1;for(int i=1;i<=D;i++)d[i]=d[i-1]*2; for(int i=0;i<=D;i++)f[i][0]=1; for(int i=1;i<=D;i++)for(int j=1;j<=i;j++)f[i][j]=f[i-1][j-1]+f[i-1][j]; LL n,t=0;scanf("%lld",&n); n=(n+1)/2; for(int i=D;i>=0;i--) { if(n>=d[i]) { n-=d[i]; t++; for(int j=0;j<=i;j++)c[t+j]+=f[i][j]; } } LL ans=1; for(int i=1;c[i];i++)ans=ans*qpow(i,c[i])%mod; printf("%lld\n",ans); return 0; }
- 1
信息
- ID
- 784
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 9
- 标签
- 递交数
- 7
- 已通过
- 6
- 上传者