BZOJ 1833 数字计数(统计[a,b]每个数字出现次数)
2014-06-20 15:46
281 查看
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1833
题意:给定区间[a,b]。求区间内0到9每个数字出现的次数。
思路:f[i][j]表示到后i位是否全 0(j=1表示i位之前全0)这个状态某个数字出现的次数,p[i][j]表示这个状态后面有多少个数字。那么当前枚举到的数字为要统计的数字时,答案加 上后面还有多少种数字,即下一个状态的p值。那么我们枚举要统计的数字依次统计即可。
题意:给定区间[a,b]。求区间内0到9每个数字出现的次数。
思路:f[i][j]表示到后i位是否全 0(j=1表示i位之前全0)这个状态某个数字出现的次数,p[i][j]表示这个状态后面有多少个数字。那么当前枚举到的数字为要统计的数字时,答案加 上后面还有多少种数字,即下一个状态的p值。那么我们枚举要统计的数字依次统计即可。
i64 f[20][2],p[20][2]; i64 n,m; int a[20],aNum; int cur; pair<i64,i64> DFS(int dep,int flag,int allZero) { if(dep==-1) return MP(0,1); if(!flag&&f[dep][allZero]!=-1) return MP(f[dep][allZero],p[dep][allZero]); i64 x=0,y=0; int L=flag?a[dep]:9; int i; for(i=0;i<=L;i++) { pair<i64,i64> q=DFS(dep-1,flag&&(i==L),allZero&&(i==0)); x+=q.first; y+=q.second; if(i==cur) { if(i==0&&!allZero||i!=0) x+=q.second; } } if(!flag) { f[dep][allZero]=x; p[dep][allZero]=y; } return MP(x,y); } i64 cal(i64 n,int x) { if(n==0) return 0; cur=x; aNum=0; while(n) { a[aNum++]=n%10; n/=10; } pair<i64,i64> p=DFS(aNum-1,1,1); return p.first; } int main() { RD(n); RD(m); i64 a[20]={0}; int i; FOR0(i,10) { clr(f,-1); a[i]=cal(m,i)-cal(n-1,i); } printf("%lld",a[0]); FOR1(i,9) printf(" %lld",a[i]); puts(""); }
相关文章推荐
- BZOJ 1833: [ZJOI2010]count 数字计数(在[a,b]中的所有整数中,每个数码(digit)各出现了多少次)
- 随机产生50个数字,每个数字的范围是[10, 50],统计每个数字出现的次数
- 第十三周项目5--统计每个数字字符出现的次数
- 随机生成50个数,范围在【10,50】,统计每个数字出现的次数以及出现次数最多的数字与它的个数。
- 给定一个由数字组成的字符串,如:"12395868392",统计出每个数字出现的次数
- 14--5--3统计每个数字字符出现的次数
- 随机生成 50 个数字,每个数字的范围在 [10, 50] 之间,统计每个数字出现的次数,最后将每个数字和它出现的次数打印出来
- 统计用户输入的一串数字中每个数字出现的次数
- 随机产生50个30到35的整数,统计每个数字出现的次数(TreeMap实现),输出时按照数字的降序排列,并且统计出现次数最多的数字和它的次数。
- 第13周-项目1-小玩文件-用键盘输入文件名,统计输出文件中每个字母、数字字符出现的次数
- 定义一个16位长整型数,统计里面0~9每个数字出现的次数。(包括将长整型转化为字符数组的方法及switch的用法)
- 利用Map实现统计一组数字(字母)中每个数字(字母)出现的次数
- 统计用户输入的一串数字中每个数字出现的次数和Winform ComboBox拥有(name,values)
- Poj 3286 How many 0's? + Bzoj 1833 count 数字计数(数位统计)
- java读取txt文件,并统计每行中每个字母出现的次数,并将产生的数字保存到一个新的txt文件中(有加分)
- 第13周 项目5-4 统计每个数字出现的次数
- 统计用户输入的一串数字中每个数字出现的次数
- 统计用户输入的一串数字中每个数字出现的次数
- 统计用户输入的一串数字中每个数字出现的次数
- 随机产生50个整数,位于[10,50],统计每个数字出现的次数以及出现次数最多的数字与出现次数并打印.如果出现次数为0不打印,打印时要求升序