bzoj 1833 数字计数

题目大意:

给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次

思路:

不知道黄学长他们的dp都是怎么dp的

搞神的方法太强啦

%%%

数位乱搞。。

推了公式,然后每一位直接套用公式

每一位分3种情况

小于该位数字的直接+10的位数次方

等于的+10的位数减一次方再加上后面几位构成数字那么多

大于的+10的位数减一次方

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<cstdlib>
 5 #include<cstring>
 6 #include<algorithm>
 7 #include<vector>
 8 #include<queue>
 9 #define inf 2139062143
10 #define ll long long
11 using namespace std;
12 inline ll read()
13 {
14     ll x=0,f=1;char ch=getchar();
15     while(!isdigit(ch)) {if(ch==‘-‘) f=-1;ch=getchar();}
16     while(isdigit(ch)) {x=x*10+ch-‘0‘;ch=getchar();}
17     return x*f;
18 }
19 ll res[10][2],a,b;
20 void solve(ll x,ll d)
21 {
22     ll k,t=1,p=0;
23     while(10*t<=x) t*=10,p++;
24     //cout<<x<<" "<<t<<" "<<p;
25     while(t)
26     {
27         k=(x/t)%10;
28         res[0][d]+=x/(t*10)*pow(10,p);
29         if(!k) res[0][d]-=pow(10,p)-x%t-1;
30         else res[k][d]+=x/(t*10)*pow(10,p)+x%t+1;
31         for(int i=1;i<k;i++)
32             res[i][d]+=(x/(t*10)+1)*pow(10,p);
33         for(int i=k+1;i<=9;i++)
34             res[i][d]+=x/(t*10)*pow(10,p);
35         t/=10,p--;
36     }
37 }
38 int main()
39 {
40     a=read(),b=read();
41     solve(a-1,0);solve(b,1);
42     for(ll i=0;i<9;i++) printf("%lld ",res[i][1]-res[i][0]);
43     printf("%lld",res[9][1]-res[9][0]);
44 }

原文地址:https://www.cnblogs.com/yyc-jack-0920/p/8495068.html

时间: 2024-10-03 07:09:25

bzoj 1833 数字计数的相关文章

BZOJ 1833 数字计数(统计[a,b]每个数字出现次数)

题目链接: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值.那么我们枚举要统计的数字依次统计即可. i64 f[20][2],p[20][2]; i64

BZOJ 1833 数字计数(数位DP)

经典数位DP模板题. # include <cstdio> # include <cstring> # include <cstdlib> # include <iostream> # include <vector> # include <queue> # include <stack> # include <map> # include <set> # include <cmath>

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

dp(i, j, k)表示共i位, 最高位是j, 数字k出现次数. 预处理出来. 差分答案, 对于0~x的答案, 从低位到高位进行讨论 ------------------------------------------------------------------------------ #include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 16; const int N =

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

1833: [ZJOI2010]count 数字计数 Time Limit: 3 Sec Memory Limit: 64 MB Submit: 1697 Solved: 753 [Submit][Status][Discuss] Description 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. Input 输入文件中仅包含一行两个整数a.b,含义如上所述. Output 输出文件中包含一行10个整数,分别表示0-9在[a,b]中出现了多少次.

【BZOJ】【1833】【ZJOI2010】count 数字计数

数位DP Orz iwtwiioi 学习了一下用记忆化搜索来捉题的新姿势……但没学会TAT,再挖个坑(妈蛋难道对我来说数位DP就是个神坑吗……sigh) 1 //BZOJ 1833 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 #include<iostream> 6 #include<algorithm> 7 #define rep(i,n) for(int i=0;i

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

题目链接:BZOJ - 1833 题目分析 数位DP .. 用 f[i][j][k] 表示第 i 位是 j 的 i 位数共有多少个数码 k . 然后差分询问...Get()中注意一下,如果固定了第 i 位,这一位是 t ,那么数码 t 的答案是要加一个值的(见代码). 代码 #include <iostream> #include <cstdlib> #include <cstdio> #include <cstring> #include <cmat

1833: [ZJOI2010]count 数字计数

1833: [ZJOI2010]count 数字计数 Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 2951  Solved: 1307[Submit][Status][Discuss] Description 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. Input 输入文件中仅包含一行两个整数a.b,含义如上所述. Output 输出文件中包含一行10个整数,分别表示0-9在[a,b]中出现了多少次.

BZOJ_1833_[ZJOI2010]_数字计数_(数位dp)

描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1833 统计\(a~b\)中数字\(0,1,2,...,9\)分别出现了多少次. 分析 数位dp真是细节又多又容易出错,我都懒得看题解,所以也就懒得写题解了... 注意细节吧还是... 1 #include <bits/stdc++.h> 2 using namespace std; 3 4 typedef long long ll; 5 ll a,b; 6 ll A[10],B[10],n

【BZOJ-1833】count数字计数 数位DP

1833: [ZJOI2010]count 数字计数 Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 2494  Solved: 1101[Submit][Status][Discuss] Description 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. Input 输入文件中仅包含一行两个整数a.b,含义如上所述. Output 输出文件中包含一行10个整数,分别表示0-9在[a,b]中出现了多少次.