100 #P1634. *【DP状态设计】TYB的数学难题(好题)
*【DP状态设计】TYB的数学难题(好题)
Description
【题意】$a_n$ 表示 $n$ 转成 2 进制中1的个数,求 $(a_1*a_3*......*a_{n-2}*a_n)\bmod (10^8+7)$。
【输入格式】
一行一个数$n$($1 \le n \le 10^{15}$),并保证$n$为奇数。
【输出格式】
输出一行一个整数。
【样例输入】
3
【样例输出】
2
Hint
#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;
}