题目简述:
设
sum(x)
为
x
的二进制表示中
∏i=1nsum(i)
题解:
看上去就是数位dp。。
先把 n 拆成二进制,然后枚举二进制数中
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
const int inf=0x3f3f3f3f;
int getint()
{
int f=1,g=0;char c=getchar();
while(c<'0' || c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0' && c<='9')g=(g<<3)+(g<<1)+c-'0',c=getchar();
return f*g;
}
const int maxl=61;
const int mod=10000007;
ll c[maxl][maxl];
int a[maxl];
ll n;
ll len;
void init()
{
for(int i=0;i<maxl;i++)
{
c[i][0]=1;
for(int j=1;j<=i;j++)
{
c[i][j]=c[i-1][j-1]+c[i-1][j];
}
}
}
ll power(ll x,ll y)
{
ll res=1ll;
for(;y;y>>=1ll,x=x*x%mod)
{
if(y&1ll)res=res*x%mod;
}
return res;
}
ll get(ll x)
{
ll res=0;
for(ll i=len;i>=1;i--)
{
if(a[i])
{
res+=c[i-1][x];
x--;
}
if(x<0)break;
}
return res;
}
int main()
{
// freopen("in.txt","r",stdin);
init();
cin>>n;
len=0;
n++;
while(n)a[++len]=n&1,n>>=1;
ll ans=1ll;
for(int i=1;i<=len;i++)
{
ans=ans*power(i,get(i))%mod;
}
printf("%lld\n",ans);
return 0;
}
Q:为什么这么水的题还来发题解
A:其实还是在试Markdown。。。。