Description

问 \([L,R]\) 中0-9的个数.

Sol

数位DP.

预处理好长度为 \(i\), 最高位为 \(j\) 的数位之和.

然后从上往下计算,不要忘记往下走的同时要把高位的贡献加上去..

Code

/**************************************************************
Problem: 1833
User: BeiYu
Language: C++
Result: Accepted
Time:40 ms
Memory:1396 kb
****************************************************************/ #include <cstdio>
#include <cstring>
#include <iostream>
using namespace std; typedef long long LL;
const int N = 65; struct S {
LL a[10];
S(LL v=0) { for(int i=0;i<10;i++) a[i]=v; }
}f[N][10][2]; S operator + (const S &a,const S &b) {
S c;for(int i=0;i<10;i++) c.a[i]=a.a[i]+b.a[i];
return c;
}
S operator - (const S &a,const S &b) {
S c;for(int i=0;i<10;i++) c.a[i]=a.a[i]-b.a[i];
return c;
}
S operator * (const S &a,const LL &b) {
S c;for(int i=0;i<10;i++) c.a[i]=a.a[i]*b;
return c;
}
void Print(const S &a) { for(int i=0;i<9;i++) cout<<a.a[i]<<" ";cout<<a.a[9]; } LL l,r;
LL pow10[N]; inline LL Pow(LL a,LL b,LL r=1) { return pow10[b]; }
void init() {
pow10[0]=1;
for(int i=1;i<=15;i++) pow10[i]=pow10[i-1]*10LL; for(int i=0;i<10;i++) {
f[1][i][0]=f[1][i][1]=f[1][i-1][0];
f[1][i][0].a[i]+=1,f[1][i][1].a[i]+=1;
}
for(int l=2;l<=14;l++) {
f[l][0][0]=f[l-1][9][0];
f[l][0][1]=f[l-1][9][1];
f[l][0][1].a[0]+=Pow(10,l-1);
for(int i=1;i<10;i++) {
f[l][i][0]=f[l][i-1][0]+f[l-1][9][1];
f[l][i][0].a[i]+=Pow(10,l-1);
f[l][i][1]=f[l][i-1][1]+f[l-1][9][1];
f[l][i][1].a[i]+=Pow(10,l-1);
}
} // for(int l=1;l<=5;l++) for(int i=0;i<10;i++) {
// cout<<l<<":"<<i<<endl;
// Print(f[l][i][0]),Print(f[l][i][1]);
// cout<<"-------------------------------"<<endl;
// }
}
S calc(LL x) {
LL g=0,nn;S r,t;
for(int i=13;~i;i--) {
if(x/pow10[i]) {
nn=(LL)(x/pow10[i])*pow10[i];
r=r+t*nn; t.a[x/pow10[i]]++; r=r+f[i+1][x/pow10[i]-1][g];
g=1;
// cout<<i+1<<" "<<x/pow10[i]-1<<" "<<g<<endl;
}else {
if(g) t.a[0]++;
}x%=pow10[i];
// cout<<i<<" ";Print(r);
}return r;
}
int main() {
init(); cin>>l>>r; S ans1=calc(r+1);
S ans2=calc(l); // Print(ans1),Print(ans2);
Print(ans1-ans2);
return 0;
}

  

BZOJ 1833: [ZJOI2010]count 数字计数的更多相关文章

  1. BZOJ 1833: [ZJOI2010]count 数字计数( dp )

    dp(i, j, k)表示共i位, 最高位是j, 数字k出现次数. 预处理出来. 差分答案, 对于0~x的答案, 从低位到高位进行讨论 -------------------------------- ...

  2. [BZOJ 1833] [ZJOI2010] count 数字计数 【数位DP】

    题目链接:BZOJ - 1833 题目分析 数位DP .. 用 f[i][j][k] 表示第 i 位是 j 的 i 位数共有多少个数码 k . 然后差分询问...Get()中注意一下,如果固定了第 i ...

  3. bzoj 1833 [ZJOI2010]count 数字计数(数位DP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1833 [题意] 统计[a,b]区间内各数位出现的次数. [思路] 设f[i][j][k ...

  4. BZOJ 1833 ZJOI2010 count 数字计数 数位DP

    题目大意:求[a,b]间全部的整数中0~9每一个数字出现了几次 令f[i]为i位数(算前导零)中每一个数出现的次数(一定是同样的,所以仅仅记录一个即可了) 有f[i]=f[i-1]*10+10^(i- ...

  5. bzoj 1833: [ZJOI2010]count 数字计数【数位dp】

    非典型数位dp 先预处理出f[i][j][k]表示从后往前第i位为j时k的个数,然后把答案转换为ans(r)-ans(l-1),用预处理出的f数组dp出f即可(可能也不是dp吧--) #include ...

  6. 1833: [ZJOI2010]count 数字计数

    1833: [ZJOI2010]count 数字计数 Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 2951  Solved: 1307[Submit][ ...

  7. 【BZOJ】1833 [ZJOI2010]count 数字计数

    [算法]数位DP [题解] 记忆化搜索 #include<cstdio> #include<algorithm> #include<cstring> #define ...

  8. 1833: [ZJOI2010]count 数字计数 - BZOJ

    Description给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次.Input输入文件中仅包含一行两个整数a.b,含义如上所述.Output输出文件中包含一 ...

  9. 【BZOJ】1833: [ZJOI2010] count 数字计数(数位dp)

    题目 传送门:QWQ 分析 蒟蒻不会数位dp,又是现学的 用$ dp[i][j][k] $ 表示表示长度为i开头j的所有数字中k的个数 然后预处理出这个数组,再计算答案 代码 #include < ...

随机推荐

  1. [zz]如何在C语言程序中处理汉字

    学习过C语言的人也许有时会遇到这样一个问题:如何用变量存储汉字以及对这些变量进行操作.目前许多C语言参考书中都没涉及到这个问题,程序中多为处理英文变量和英文字符串,涉及到汉字的情况也大都是在print ...

  2. WPF中监视DependencyProperty的变化

    WPF中监视DependencyProperty的变化   周银辉 尽管一个类会提供很多事件,但有时候还是显得不够,比如说前两天我就以为WPF的ListBox控件会有ItemsSourceChange ...

  3. Linux Linux程序练习十八

    题目:编写一个TCP服务器和客户端,基于TCP的并发远程shell 要求实现: )对于所有收到的客户端消息,作为命令行进行执行, 并且将命令行的输出结果返回给客户端 )要求使用并发结构 )实现关键代码 ...

  4. PL/SQL 如何查看当前连接信息以及SQL PLUS如何指定IP地址

    1.通过PL/SQL 想连接别的数据库可以通过在服务名前面加上IP和左斜线来实现: 2.有时我们的IP和左斜线不用输也能连别的数据库,是因为在一个文件里配置好了.这个文件在哪里? 在这个路径下的 NE ...

  5. Query节点操作,jQuery插入节点,jQuery删除节点,jQuery Dom操作

    一.创建节点 var box = $('<div>节点</div>'); //创建一个节点,或者var box = "<div>节点</div> ...

  6. Writing Clean Code 读后感

    最近花了一些时间看了这本书,书名是 <Writing Clean Code ── Microsoft Techniques for Developing Bug-free C Programs& ...

  7. AppBox升级进行时 - 扁平化的权限设计

    AppBox 是基于 FineUI 的通用权限管理框架,包括用户管理.职称管理.部门管理.角色管理.角色权限管理等模块. AppBox v2.0中的权限实现 AppBox v2.0中权限管理中涉及三个 ...

  8. 【三石jQuery视频教程】03.创建垂直时间表(Timeline)

    视频地址:http://v.qq.com/page/g/i/o/g0150rvi6io.html 大家好,欢迎来到[三石jQuery视频教程],我是您的老朋友 - 三生石上. 今天,我们要通过基本的H ...

  9. Gson解析json字符串

    // 解析传递过来的json字符串 JsonParser parser = new JsonParser(); JsonObject jsonObj = parser.parse(strJson).g ...

  10. poj-3264-Balanced Lineup

    poj   3264  Balanced Lineup link: http://poj.org/problem?id=3264 Balanced Lineup Time Limit: 5000MS ...