bzoj3209 花神的数论题 数位DP
来源:互联网 发布:网络暴力调查报告配图 编辑:程序博客网 时间:2024/05/22 15:38
一开始想的是先预处理出n位的答案,因为假设当前给出的数x有y位,那么y-1位的答案是固定的,我只要处理y位的答案就可以了,问题是这样太复杂。。。
设f[i][j]表示i位有j个1的答案,那么明显有f[i][j]=f[i-1][j]+f[i-1][j-1],表示第i位选0或1.
然后最后统计一下答案,就是每一种出现了多少次。。
其实挺简单的,基本想出来了,但是数位dp不熟,想的复杂了。
#include<cstdio>#include<cstring>#include<algorithm>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)using namespace std;const int N=1e5+5;const int mo=10000007;typedef long long ll;ll n;ll sum[100],f[100][100],g[100];int wei[N];int tot;ll ans;inline void pre(){ f[0][0]=1; fo(i,1,60) { f[i][0]=1; fo(j,1,i) f[i][j]=f[i-1][j-1]+f[i-1][j]; }}ll solve(int x){ ll sum=0; fd(i,tot,1) { if (wei[i]==1) { sum+=f[i-1][x]; --x; } if (x<0)break; } return sum;} ll pow(ll a,ll b){ ll ret=1; while (b) { if (b&1)ret=ret*a%mo; a=a*a%mo; b>>=1; } return ret;}int main(){ pre(); scanf("%lld",&n); ++n; tot=0; while (n) { wei[++tot]=n&1; n>>=1; } ans=1ll; fo(i,1,tot) ans=ans*pow(i,solve(i))%mo; printf("%lld\n",ans%mo); return 0;}
阅读全文
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
- TimeUnit用法
- 【华为机试】字串的连接最长路径查找
- CSU-ACM2017暑假集训2-二分搜索 hdu2141- Can you find it?
- 如何提升用户留存率?
- HDU 2141 Can you find it? <二分>
- bzoj3209 花神的数论题 数位DP
- window.location.href的用法(动态输出跳转)
- 求数组中出现次数超过一半的数字
- tensorflow学习笔记之MNIST入门
- 高斯模糊算法
- Data Binding学习(一)
- 虚函数&多态
- Jenkins-部署(一)
- 1.1云存储技术的起源与发展