【bzoj3209】【花神的数论题】【数位dp+快速幂】
来源:互联网 发布:选择财物软件方案 编辑:程序博客网 时间:2024/05/23 01:11
Description
背景
众所周知,花神多年来凭借无边的神力狂虐各大 OJ、OI、CF、TC …… 当然也包括 CH 啦。
描述
话说花神这天又来讲课了。课后照例有超级难的神题啦…… 我等蒟蒻又遭殃了。
花神的题目是这样的
设 sum(i) 表示 i 的二进制表示中 1 的个数。给出一个正整数 N ,花神要问你
派(Sum(i)),也就是 sum(1)—sum(N) 的乘积。
Input
一个正整数 N。
Output
一个数,答案模 10000007 的值。
Sample Input
样例输入一
3
3
Sample Output
样例输出一
2
2
HINT
对于样例一,1*1*2=2;
数据范围与约定
对于 100% 的数据,N≤10^15
题解:另f[i][j]表示以0开头的i位数中1的个数为j的数的数量。
g[i][j]表示以1开头的i位数中1的个数为j的数的数量。
显然 f[i][j]=f[i-1][j]+g[i-1][j];
g[i][j]=f[i-1][j-1]+g[i-1][j-1];
然后数位dp+快速幂即可。
代码:
#include<iostream>#include<cstring>#include<cstdio>#define P 10000007#define ll long longll f[100][100],g[100][100],n;using namespace std;ll power(ll a,ll b){ ll ans(1); for (ll i=b;i;i>>=1,(a*=a)%=P) if (i&1) (ans*=a)%=P; return ans; }ll cal(ll x){ ll t(0),c(0),ans(1); for (t=0;1ll<<t<=x;t++); for (;t;t--){ if ((1ll<<t-1)&x){ for (int i=1;i<=t;i++) (ans*=power(i+c,f[t][i]))%=P; if (c)(ans*=c)%=P;c++; } } return (ans*c)%P;}int main(){ scanf("%lld",&n); f[1][0]=1;g[1][1]=1; for (int i=2;i<=60;i++) for (int j=0;j<=i;j++){ f[i][j]=(f[i-1][j]+g[i-1][j]); if (j!=0)g[i][j]=(f[i-1][j-1]+g[i-1][j-1]); } printf("%lld",cal(n));}
0 0
- 【bzoj3209】【花神的数论题】【数位dp+快速幂】
- BZOJ3209 花神的数论题(数位dp)
- [BZOJ3209]花神的数论题(数位dp)
- bzoj3209 花神的数论题 数位DP
- 【BZOJ3209】花神的数论题 数位DP(我姿势不标准,但是可能更好写)
- BZOJ3209 花神的数论题
- [BZOJ3209]花神的数论题
- bzoj3209 花神的数论题
- bzoj3209 花神的数论题
- bzoj3209: 花神的数论题
- [BZOJ3209]花神的数论题
- [数位dp] bzoj 3209 花神的数论题
- BZOJ 3209 花神的数论题 数位DP+数论
- BZOJ 3209 花神的数论题 数位DP
- BZOJ 3209 花神的数论题 (数位DP)
- bzoj 3209 花神的数论题(数位dp)
- HYSBZ 3209 花神的数论题(数位dp)
- bzoj 3209: 花神的数论题 数位dp
- C 字符与字符串的库函数总结
- 【杭电】[2044]一只小蜜蜂...
- dedecms5.7 PHP5.4不兼容5.3的汉字问题
- HDU 2030 汉字统计
- android Java 提交数据到服务器的两种方式中四种方法
- 【bzoj3209】【花神的数论题】【数位dp+快速幂】
- 【追求进步】腾讯实习生面试题
- HihoCoder Trie树 java实现
- Swift变量名的一种玩法
- Linux系统日志
- springMVC4(8)模型数据绑定全面分析
- 海康威视Android SDK,并非萤石Android SDK
- 命令学习 of Ubuntu
- nginx access_log 完全关闭