bzoj1833

http://www.lydsy.com/JudgeOnline/problem.php?id=1833

2.5个小时就花在这上面了。。。

水到200题了。。。然并卵,天天做水题有什么前途。。。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll A, B;
ll dp[20][20][20], a[20], ret[20], ans[20], bin[20];
void solve(ll n, int f)
{
    int len = 0; ll t = n; memset(a, 0, sizeof(a)); memset(ret, 0, sizeof(ret));
    while(n) a[++len] = n % 10, n /= 10;
    for(int i = 1; i < len; ++i)
        for(int j = 1; j <= 9; ++j)
            for(int k = 0; k <= 9; ++k) ret[k] += dp[i][j][k];
//    for(int i = 1; i < a[len]; ++i)
//        for(int j = 0; j <= 9; ++j) ret[j] += dp[len][i][j];
    for(int i = len; i; --i)
    {
        for(int j = 0; j < a[i]; ++j)
        {
            if(!j && i == len) continue;
            for(int k = 0; k <= 9; ++k) ret[k] += dp[i][j][k];
        }
        ret[a[i]] += t % bin[i] + 1;
    }
    for(int i = 0; i <= 9; ++i) ans[i] += f * ret[i];
}
int main()
{
//    freopen("countzj.in", "r", stdin);
//    freopen("countzj.out", "w", stdout);
    bin[1] = 1ll; for(int i = 2; i <= 13; ++i) bin[i] = bin[i - 1] * 10ll;
    for(int i = 0; i <= 9; ++i) dp[1][i][i] = 1;
    for(int i = 2; i <= 13; ++i)
        for(int j = 0; j <= 9; ++j)
            for(int k = 0; k <= 9; ++k)
                for(int l = 0; l <= 9; ++l) dp[i][j][l] += dp[i - 1][k][l] + (ll)(j == l) * bin[i - 1];
    scanf("%lld%lld", &A, &B);
    solve(B, 1); solve(A - 1, -1);
    for(int i = 0; i <= 8; ++i) printf("%lld ", ans[i]);
    printf("%lld\n", ans[9]);
//    fclose(stdin); fclose(stdout);
    return 0;
}

时间: 2024-10-19 04:34:46

bzoj1833的相关文章

【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]}$表示第${

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

[问题描述] 给定两个正整数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】数字计数 数位DP

链接: #include <stdio.h> int main() { puts("转载请注明出处[辗转山河弋流歌 by 空灰冰魂]谢谢"); puts("网址:blog.csdn.net/vmurder/article/details/46444975"); } 题解: 然而并没有DP. [1,R]的答案减去[1,L]的答案. 对于一个数 X ,求 [1,X] 的答案,我是先处理出 [1,999--9] 的答案(那个999--9 < X) 然后按

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

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

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

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

bzoj1833 digit

这道题其实挺水,只是写的时候需要想清楚.我的方法是: 1.将[a,b]转化为[0,b+1)-[0,a) 2.预处理出非0的v在区间[0,10^p)出现次数以及0在区间[0,10^p)出现数 3.将一个区间再拆分为几段,如: 12345拆分为[0,10000),[10000,12000),[12000,12300),[12300,12340),[12340,12346) 下面是代码: 1 #include<cstdio> 2 using namespace std ; 3 4 static cl

BZOJ1833 数位DP

数位DP随便搞搞. #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<ctime> #include<string> #include<iomanip> #include<algorithm> #include<map> using namesp

[bzoj1833][ZJOI2010][count] (数位dp)

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