bzoj1833 [ZJOI2010]count 数字计数

题目链接

我是DP弱者!!!我是DP弱者!!!我是DP弱者!!!

调了好久,数位DP好恼火QAQ

 1 #include<algorithm>
 2 #include<iostream>
 3 #include<cstdlib>
 4 #include<cstring>
 5 #include<cstdio>
 6 #include<string>
 7 #include<cmath>
 8 #include<ctime>
 9 #include<queue>
10 #include<stack>
11 #include<map>
12 #include<set>
13 #define rre(i,r,l) for(int i=(r);i>=(l);i--)
14 #define re(i,l,r) for(int i=(l);i<=(r);i++)
15 #define Clear(a,b) memset(a,b,sizeof(a))
16 #define inout(x) printf("%d",(x))
17 #define douin(x) scanf("%lf",&x)
18 #define strin(x) scanf("%s",(x))
19 #define LLin(x) scanf("%lld",&x)
20 #define op operator
21 #define CSC main
22 typedef unsigned long long ULL;
23 typedef const int cint;
24 typedef long long LL;
25 using namespace std;
26 void inin(int &ret)
27 {
28     ret=0;int f=0;char ch=getchar();
29     while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=1;ch=getchar();}
30     while(ch>=‘0‘&&ch<=‘9‘)ret*=10,ret+=ch-‘0‘,ch=getchar();
31     ret=f?-ret:ret;
32 }
33 LL ten[13];
34 LL dp[13][10][10];
35 void getpre()
36 {
37     ten[0]=1;
38     re(i,1,12)ten[i]=ten[i-1]*10;
39     re(i,0,9)dp[1][i][i]=1;
40     re(i,2,12)re(j,0,9)re(k,0,9)
41     {
42         dp[i][j][k]=(j==k)?ten[i-1]:0;
43         re(t,0,9)dp[i][j][k]+=dp[i-1][t][k];
44     }
45 }
46 int getbit(LL x)
47 {
48     int ret=0;
49     while(x)
50         x/=10,ret++;
51     return ret;
52 }
53 LL ans[10];
54 int num[15];
55 void calc(LL temp,int bit,bool qian)
56 {
57     if(!bit)return;
58     if(qian)
59         re(i,0,num[bit]-1)
60             re(j,0,9)
61                 ans[j]+=dp[bit][i][j];
62     else re(i,1,num[bit]-1)re(j,0,9)ans[j]+=dp[bit][i][j];
63     ans[num[bit]]+=temp%ten[bit-1]+1;
64     calc(temp,bit-1,1);
65 }
66 void calc2(LL temp,int bit,bool qian)
67 {
68     if(!bit)return;
69     if(qian)
70         re(i,0,num[bit]-1)
71             re(j,0,9)
72                 ans[j]-=dp[bit][i][j];
73     else re(i,1,num[bit]-1)re(j,0,9)ans[j]-=dp[bit][i][j];
74     ans[num[bit]]-=temp%ten[bit-1]+1;
75     calc2(temp,bit-1,1);
76 }
77 int main()
78 {
79     getpre();
80     LL l,r;
81     scanf("%lld%lld",&l,&r);
82     int len=0;
83     LL temp=r;
84     while(r)num[++len]=r%10,r/=10;
85     calc(temp,len,0);
86     re(i,1,len-1)re(j,0,9)re(k,1,9)ans[j]+=dp[i][k][j];
87     len=0,temp=l-1;l--;
88     while(l)num[++len]=l%10,l/=10;
89     calc2(temp,len,0);
90     re(i,1,len-1)re(j,0,9)re(k,1,9)ans[j]-=dp[i][k][j];
91     re(i,0,9)printf("%lld%c",ans[i],i==9?‘\n‘:‘ ‘);
92      return 0;
93 }
时间: 2024-10-26 10:03:50

bzoj1833 [ZJOI2010]count 数字计数的相关文章

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>

数位DP入门:bzoj1833: [ZJOI2010]count 数字计数

膜拜了一下蔡大神....然后突然想起来一些东西然后就填了一个半年多前的坑= = 人生第一道自己写的数位DP...好吧以前是看题解然后也不知道为什么就过了的>_< 数位DP介绍: http://wenku.baidu.com/link?url=9OS5Ybpw5wx00ahrH8ED2oyIlR1uWwrxT8N4pEg27GgBt2T2hLe4sd_h1rmpY7P0HmeHIEDw9h6_K98dPhhjoMhD2TpKcS8w1X8cC_dkPp_ 接下来是题目地址: http://www

bzoj1833: [ZJOI2010]count 数字计数 &amp;&amp; codevs1359 数字计数

bzoj1833 codevs1359 这道题也是道数位dp 因为0有前导0这一说卡了很久 最后发现用所有位数减1~9的位数就okay.....orzczl大爷 其他就跟51nod那道统计1出现次数一样啦 #include<cstdio> #include<cstring> #include<algorithm> #define LL long long using namespace std; LL read(){ LL ans=0,f=1,c=getchar();

BZOJ1833 [ZJOI2010]count 数字计数 【数学 Or 数位dp】

题目 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. 输入格式 输入文件中仅包含一行两个整数a.b,含义如上所述. 输出格式 输出文件中包含一行10个整数,分别表示0-9在[a,b]中出现了多少次. 输入样例 1 99 输出样例 9 20 20 20 20 20 20 20 20 20 提示 30%的数据中,a<=b<=10^6: 100%的数据中,a<=b<=10^12. 题解 你以为我真的会写数位dp? 首先容斥一下,转化为求小于等于

BZOJ1833: [ZJOI2010]count 数字计数 (数位dp)

传送门 数位dp... ...大概都是这个套路吧... ... 写这个的时候直接水了一发... ...我也不知道自己写的是不是dp... ... 大概是主要内容和dp关系不大的dp... ... mark代码..细长的代码真是丑啊..换行太频繁了.... 1 #include<cmath> 2 #include<cstdio> 3 #include<cstring> 4 #include<iostream> 5 #include<algorithm&g

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

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