BZOJ 1833
来源:互联网 发布:淘宝密码修改 编辑:程序博客网 时间:2024/06/16 01:11
最近新学了数位DP,bzoj1833是不错的练手入门题。
这题难度适中,有人可能会被a和b较大的值吓到,其实用数位DP是容易的。
用f[i][j][k]表示到有i位数,首位为j,数码k的个数。
可以先初始化好一张这样的表,然后读入时操作一下就好了,自己yy一下就好。
代码:
/************************************************************** Problem: 1833 User: fantasticwtl Language: C++ Result: Accepted Time:0 ms Memory:1300 kb****************************************************************/#include <iostream>#include <cmath>#include <algorithm>using namespace std;unsigned long long a,b,f[21][10][10];unsigned long long sol (unsigned long long x,int y){ int len=0,wz[21]= {0}; unsigned long long ans=0,g=x-1; while(x)wz[++len]=x%10,x/=10; for(int i=1; i<len; i++) for(int j=1; j<=9; j++)ans+=f[i][j][y]; for(int j=1; j<wz[len]; j++)ans+=f[len][j][y]; for(int i=len-1; i>=1; i--) { for(int j=0; j<wz[i]; j++)ans+=f[i][j][y]; if(wz[i+1]==y)ans+=g-(1ll*pow(10,i)*y)+1; g-=1ll*pow(10,i)*wz[i+1]; } return ans;}int main (){ for(int i=0; i<=9; i++)f[1][i][i]=1; for(int i=2; i<=12; i++) for(int j=0; j<=9; j++) { for(int kk=0; kk<=9; kk++) for(int k=0; k<=9; k++)f[i][j][kk]+=f[i-1][k][kk]; f[i][j][j]+=pow(10,i-1); }//初始化f数组 cin>>a>>b;//读入 for(int i=0; i<=8; i++)cout<<(sol(b+1,i)-sol(a,i))<<' '; cout<<(sol(b+1,9)-sol(a,9))<<endl;//行末不能有空格,会PE}
1 0
- BZOJ 1833
- [BZOJ ]
- BZOJ****-****
- BZOJ
- BZOJ
- BZOJ
- BZOJ
- BZOJ
- BZOJ
- BZOJ
- BZOJ
- BZOJ
- BZOJ
- bzoj
- bzoj
- BZOJ
- BZOJ
- bzoj
- Jsp到Action后台的数据接收方法
- Runtime运行时机制
- 二叉树java版
- 最小二乘法拟合圆
- Swift - 页面传值
- BZOJ 1833
- 构建者模式
- linux 下链接mysql练习
- 解析校内网邮箱
- 显式锁Lock、ReentrantLock
- 带标题可拖动的SeekBar
- Filezilla--FZ怎么强制出现隐藏文件
- BZOJ3223文艺平衡树
- 118. Pascal's Triangle