[BZOJ3679][数位DP]数字之积
来源:互联网 发布:霍尼韦尔净水器 知乎 编辑:程序博客网 时间:2024/05/21 14:46
学一发数位DP
如果直接记录乘积的话有
#include <cstdio>#include <cstring>#include <string>#include <iostream>#include <algorithm>using namespace std;typedef long long ll;int n;int w[20],wt;int add[10][5];ll f[2][32][21][14][13][2];ll p2[32],p3[21],p5[14],p7[13];ll L,R;inline ll solve(ll lt,int n){ memset(f,0,sizeof(f)); int k=0; wt=0; ll x=lt,ret=0; while(x) w[++wt]=x%10,x/=10; for(int i=1;i<=w[wt];i++) if(i>n) break; else if(i==w[wt]) f[0][add[i][1]][add[i][2]][add[i][3]][add[i][4]][1]=1; else f[0][add[i][1]][add[i][2]][add[i][3]][add[i][4]][0]=1; for(int j=wt-1;j;j--){ k^=1; for(int i=1;i<=9;i++) if(i<=n) f[k][add[i][1]][add[i][2]][add[i][3]][add[i][4]][0]=1; for(int i1=0;i1<=30;i1++) if(p2[i1]<=n) for(int i2=0;i2<=19;i2++) if(p3[i2]*p2[i1]<=n) for(int i3=0;i3<=13;i3++) if(p5[i3]*p3[i2]*p2[i1]<=n) for(int i4=0;i4<=11;i4++) if(p7[i4]*p2[i1]*p3[i2]*p5[i3]<=n){ ll now=p2[i1]*p3[i2]*p5[i3]*p7[i4]; for(int i=1;i<=9;i++){ if(i*now>n) break; f[k][i1+add[i][1]][i2+add[i][2]][i3+add[i][3]][i4+add[i][4]][0]+=f[k^1][i1][i2][i3][i4][0]; if(i>w[j]) continue; if(i<w[j]) f[k][i1+add[i][1]][i2+add[i][2]][i3+add[i][3]][i4+add[i][4]][0]+=f[k^1][i1][i2][i3][i4][1]; else f[k][i1+add[i][1]][i2+add[i][2]][i3+add[i][3]][i4+add[i][4]][1]+=f[k^1][i1][i2][i3][i4][1]; } } for(int i1=0;i1<=30;i1++) for(int i2=0;i2<=19;i2++) for(int i3=0;i3<=13;i3++) for(int i4=0;i4<=11;i4++) f[k^1][i1][i2][i3][i4][0]=f[k^1][i1][i2][i3][i4][1]=0; } for(int i1=0;i1<=30;i1++) for(int i2=0;i2<=19;i2++) for(int i3=0;i3<=13;i3++) for(int i4=0;i4<=11;i4++) ret+=f[k][i1][i2][i3][i4][0],f[k][i1][i2][i3][i4][0]=f[k][i1][i2][i3][i4][1]=0; return ret;}int main(){ cin>>n>>L>>R; p2[0]=p3[0]=p5[0]=p7[0]=1; for(int i=1;i<=30;i++) p2[i]=p2[i-1]*2; for(int i=1;i<=19;i++) p3[i]=p3[i-1]*3; for(int i=1;i<=13;i++) p5[i]=p5[i-1]*5; for(int i=1;i<=11;i++) p7[i]=p7[i-1]*7; add[2][1]=1; add[3][2]=1; add[4][1]=2; add[5][3]=1; add[6][1]=1; add[6][2]=1; add[7][4]=1; add[8][1]=3; add[9][2]=2; cout<<solve(R,n)-solve(L,n)<<endl; return 0;}
0 0
- 【bzoj3679】 数字之积 数位dp
- [BZOJ3679][数位DP]数字之积
- [BZOJ3679]数字之积 数位DP
- BZOJ3679: 数字之积
- [bzoj3679]数字之积
- BZOJ3679 数字之积
- BZOJ 3679 数字之积 - 数位dp
- 【数位DP】BZOJ3629数字之积
- 【数位DP】BZOJ3629数字之积
- BZOJ 3679 数字之积 (数位DP)
- [BZOJ]3679: 数字之积 数位DP
- 数位DP之找等凹数字
- 幸运数字 (数位DP)
- 【数位DP】BZOJ3780数字统计
- 【ZJOI2010】数字计数 数位dp
- hdu2089之数位dp
- hdu4507之数位DP
- hdu4734之数位dp
- 题目1005:Graduate Admission
- EventBus 讲解
- 团体程序设计天梯赛L2-019 悄悄关注
- 对GreenDao的使用
- hdu 2829 Lawrence (四边形不等式优化DP)
- [BZOJ3679][数位DP]数字之积
- 我的第一篇工作日志
- JavaScript中typeof和instanceof的区别
- shiro框架深入分析和个人总结
- 题目1006:ZOJ问题
- HBase详解
- Qt之QSS(样式表语法)
- 如何处理上线项目NSLog
- SQL语句执行顺序