bzoj1833数字计数

题目链接

找$[1$ ~ $a-1]$和$[1$ ~ $b]$中各数码出现的次数之后相减就是答案

上代码:

/**************************************************************
    Problem: 1833
    User: zhangheran
    Language: C++
    Result: Accepted
    Time:0 ms
    Memory:1292 kb
****************************************************************/

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
long long a,b;
long long f[17];
long long dp[17];
long long ansa[17];
long long ansb[17];
long long tot;
long long qwq[17];
long long qaq[17];
int lena,lenb;
int main()
{
//  freopen("1.in","r",stdin);
//  freopen("1.out","w",stdout);
    scanf("%lld%lld",&a,&b);
    dp[0]=1;
    for(int i=1;i<=15;i++)
      f[i]=f[i-1]*10+dp[i-1],
      dp[i]=dp[i-1]*10;
    a--;
    while(a) qwq[++lena]=a%10,a/=10;
    while(b) qaq[++lenb]=b%10,b/=10;

    for(int i=lena;i>=1;i--){
      long long now=0;
      for(int j=0;j<=9;j++) ansa[j]+=qwq[i]*f[i-1];
      for(int j=0;j<qwq[i];j++) ansa[j]+=dp[i-1];
      for(int j=i-1;j>0;j--) now*=10,now+=qwq[j];
      ansa[qwq[i]]+=now+1;
      ansa[0]-=dp[i-1];
//    printf("%lld %lld\n",qwq[i],ansa[qwq[i]]);
    }
//  puts("");
    for(int i=lenb;i>=1;i--){
//      printf("%lld ",qaq[i]);
      long long now=0;
      for(int j=0;j<=9;j++) ansb[j]+=qaq[i]*f[i-1];
      for(int j=0;j<qaq[i];j++) ansb[j]+=dp[i-1];
      for(int j=i-1;j>0;j--) now*=10,now+=qaq[j];
      ansb[qaq[i]]+=now+1;
      ansb[0]-=dp[i-1];
//    printf("%lld %lld\n",qaq[i],ansb[qaq[i]]);
    }
//  puts("");
    for(int i=0;i<=9;i++) printf("%lld ",ansb[i]-ansa[i]);
}
//655 1044

原文地址:https://www.cnblogs.com/cn-suqingnian/p/9374862.html

时间: 2024-08-02 23:19:08

bzoj1833数字计数的相关文章

bzoj1833 数字计数

Description 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. Input 输入文件中仅包含一行两个整数a.b,含义如上所述. Output 输出文件中包含一行10个整数,分别表示0-9在[a,b]中出现了多少次. 数位dp c[i]表示长度为i的由0~9组成的串中每个字符的出现次数 F(x)计算与x位数相同且不大于x的数中每个字符的出现次数并累加到答案数组f #include<cstdio> typedef long long lint;

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

[ZJOI2010][BZOJ1833] count 数字计数|模拟

1833: [ZJOI2010]count 数字计数 Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 1976  Solved: 873[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>

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 数字计数(统计[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: [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]中出现了多少次.