bzoj 1833: [ZJOI2010]count 数字计数

 1 #include<cstdio>
 2 #include<iostream>
 3 #define ll long long
 4 using namespace std;
 5 struct data
 6 {
 7     ll s[10];
 8 }a[15][10],sum1,sum2;
 9 ll f[18],l,r;
10 data operator +(data a1,data a2)
11 {
12     data t;
13     for(int i=0;i<=9;i++)
14       t.s[i]=a1.s[i]+a2.s[i];
15     return t;
16 }
17 data suan(ll r)
18 {
19     int k;
20     data t;
21     for(int i=0;i<=9;i++)
22       t.s[i]=0;
23     if(!r)
24       {
25         t.s[0]=1;
26         return t;
27       }
28     for(k=15;f[k]>r;k--);
29     for(int i=1;i<k;i++)
30       for(int j=1;j<=9;j++)
31         t=t+a[i][j];
32     t.s[0]++;
33     ll s12=r/f[k];
34     for(int i=1;i<s12;i++)
35       t=t+a[k][i];
36     ll s11=r%f[k];
37     t.s[s12]+=s11+1;
38     for(k--;k;k--)
39       {
40         s12=s11/f[k];
41           for(int i=0;i<s12;i++)
42             t=t+a[k][i];
43         s11%=f[k];
44         t.s[s12]+=s11+1;
45       }
46     return t;
47 }
48 int main()
49 {
50     scanf("%lld%lld",&l,&r);
51     f[1]=1;
52     for(int i=2;i<=15;i++)
53       f[i]=f[i-1]*10;
54     for(int i=0;i<=9;i++)
55       a[1][i].s[i]=1;
56     for(int i=2;i<=12;i++)
57       for(int j=0;j<=9;j++)
58         for(int k=0;k<=9;k++)
59           {
60             a[i][k]=a[i][k]+a[i-1][j];
61             a[i][k].s[k]+=f[i-1];
62           }
63     sum1=suan(r);
64     sum2=suan(l-1);
65     for(int i=0;i<9;i++)
66       printf("%lld ",sum1.s[i]-sum2.s[i]);
67     printf("%lld\n",sum1.s[9]-sum2.s[9]);
68     return 0;
69 }

数位DP,先预处理,a[i][j]代表有i位,最高位为j的各数字和。

时间: 2024-08-27 16:33:02

bzoj 1833: [ZJOI2010]count 数字计数的相关文章

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 数字计数 【数位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

BZOJ 1833 ZJOI2010 count 数字计数 数位DP

题目大意:求[a,b]间所有的整数中0~9每个数字出现了几次 令f[i]为i位数(算前导零)中每个数出现的次数(一定是相同的,所以只记录一个就行了) 有f[i]=f[i-1]*10+10^(i-1) 然后照例十进制拆分 其中计算[0,999...9]的时候要从1~9枚举最高位,然后其余位调用f[i-1]即可 剩余部分已知位直接乘,未知位调用f[i] #include<cstdio> #include<cstring> #include<iostream> #includ

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

非典型数位dp 先预处理出f[i][j][k]表示从后往前第i位为j时k的个数,然后把答案转换为ans(r)-ans(l-1),用预处理出的f数组dp出f即可(可能也不是dp吧--) #include<iostream> #include<cstdio> using namespace std; long long l,r,t[25]; struct dp { long long a[15]; dp operator + (dp x) { dp r; for(int i=0;i&l

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]中出现了多少次.

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

Description给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次.Input输入文件中仅包含一行两个整数a.b,含义如上所述.Output输出文件中包含一行10个整数,分别表示0-9在[a,b]中出现了多少次.Sample Input1 99Sample Output9 20 20 20 20 20 20 20 20 20HINT30%的数据中,a<=b<=10^6:100%的数据中,a<=b<=10^12. 首先把这个问题变成f(b)

【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]中出现了多少次.

bzoj1833: [ZJOI2010]count 数字计数(数位DP+记忆化搜索)

1833: [ZJOI2010]count 数字计数 题目:传送门 题解: 今天是躲不开各种恶心DP了??? %爆靖大佬啊!!! 据说是数位DP裸题...emmm学吧学吧 感觉记忆化搜索特别强: 定义f[i][j][k]表示若前i个位置有k个j的此时的全局方案数,然后就可以记忆化搜索了(具体看代码吧) 代码: 1 #include<cstdio> 2 #include<cstring> 3 #include<cstdlib> 4 #include<cmath>

【bzoj1833】 ZJOI2010—count 数字计数

http://www.lydsy.com/JudgeOnline/problem.php?id=1833 (题目链接) 题意 求在${[a,b]}$范围内整数中,每个数码出现的次数. Solution 数位dp. ${t}$数组取到最大数时表示每一位是多少. ${f[i][j][k]}$表示第${i}$位,这一位上的数为${j}$,数字${k}$的出现次数.转移:$${f[i][j][k]=\sum_{l=0}^9f[i-1][l][k]+10^(i-1)}$$ ${g[i][k]}$表示第${