您的位置:首页 > 其它

[BZOJ3209]花神的数论题

2015-08-07 11:28 357 查看
原题地址

数位DP…

感觉已经被数位DP虐习惯了…

#include <cstdio>
typedef long long ll;
const ll N=101;
const ll TOMOD=10000007;
ll a,len,Ans=1;
ll b
,ans
;
ll f

;

void cal(ll x,ll tag){
if(x==1){
if(b[x]) ans[tag+1]++;
ans[tag]++;
return ;
}
if(!b[x]){
cal(x-1,tag);
return ;
}
for(ll i=0;i<=x-1;i++) ans[i+tag]+=f[x-1][i];
cal(x-1,tag+1);
}

ll qpow(ll x,ll p){
if(!p) return 1;
ll y=qpow(x,p>>1);
y=(y*y)%TOMOD;
if(p&1) y=(y*x)%TOMOD;
return y;
}

int main(){
scanf("%lld",&a);
while(a){
b[++len]=a&1;
a>>=1;
}
f[1][0]=f[1][1]=1;
for(ll i=2;i<=len;i++){
for(ll j=0;j<=len;j++){
f[i][j]=f[i-1][j];
if(j) f[i][j]+=f[i-1][j-1];
}
}
cal(len,0);
for(ll i=1;i<=len;i++) Ans=(Ans*qpow(i,ans[i]))%TOMOD;
printf("%lld\n",Ans);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: