您的位置:首页 > 其它

bzoj 3209 数位DP+欧拉定理

2015-06-06 19:47 399 查看
枚举1的个数,统计有那么多1的数的个数

/**************************************************************
Problem: 3209
User: idy002
Language: C++
Result: Accepted
Time:0 ms
Memory:844 kb
****************************************************************/

#include <cstdio>
#define Mod 10000007
#define Phi 9988440

typedef long long dnt;

dnt n;
dnt dp[50][2][51];
int tb;

void dodp() {
for( tb=49; tb>=0; tb-- )
if( (n>>tb)&1 ) break;
dp[tb][1][1] = 1;
dp[tb][0][0] = 1;
for( int b=tb-1; b>=0; b-- ) {
for( int c=0; c<=tb-b+1; c++ ) {
dp[b][1][c] = dp[b+1][1][c-((n>>b)&1)];
dp[b][0][c] = (dp[b+1][0][c] + dp[b+1][0][c-1]) % Phi;
if( (n>>b)&1 ) dp[b][0][c] = (dp[b][0][c] + dp[b+1][1][c]) % Phi;
}
}
}
dnt mpow( dnt a, dnt b ) {
dnt rt;
for( rt=1; b; b>>=1,a=(a*a)%Mod )
if( b&1 ) rt=(rt*a)%Mod;
return rt;
}
int main() {
scanf( "%lld", &n );
dodp();
dnt ans = 1;
for( int c=2; c<=tb+1; c++ )
ans = (ans * mpow(c,dp[0][1][c]+dp[0][0][c])) % Mod;
printf( "%lld\n", ans );
}


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