数字0-9的数量

数字0-9的数量

基准时间限制:1 秒 空间限制:131072 KB

给出一段区间a-b,统计这个区间内0-9出现的次数。

比如 10-19,1出现11次(10,11,12,13,14,15,16,17,18,19,其中11包括2个1),其余数字各出现1次。

Input

两个数a,b(1 <= a <= b <= 10^18)

Output

输出共10行,分别是0-9出现的次数

Input示例

10 19

Output示例

1
11
1
1
1
1
1
1
1
1分析:数位dp做多了发现这题还是挺简单;   dp[pos][x][y]三维分别代表位置,当前要统计的数,当前出现了几个;   注意前导0不算即可;代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <climits>
#include <cstring>
#include <string>
#include <set>
#include <bitset>
#include <map>
#include <queue>
#include <stack>
#include <vector>
#define rep(i,m,n) for(i=m;i<=n;i++)
#define mod 1000000007
#define inf 0x3f3f3f3f
#define vi vector<int>
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define ll long long
#define pi acos(-1.0)
#define pii pair<int,int>
#define sys system("pause")
const int maxn=1e5+10;
const int N=5e4+10;
const int M=N*10*10;
using namespace std;
inline ll gcd(ll p,ll q){return q==0?p:gcd(q,p%q);}
inline ll qpow(ll p,ll q){ll f=1;while(q){if(q&1)f=f*p;p=p*p;q>>=1;}return f;}
inline void umax(ll &p,ll q){if(p<q)p=q;}
inline void umin(ll &p,ll q){if(p>q)p=q;}
inline ll read()
{
    ll x=0;int f=1;char ch=getchar();
    while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
    while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
    return x*f;
}
int n,m,k,t,num[20],pos;
ll dp[20][10][20],p,q,ans[10];
ll dfs(int pos,int x,int y,int z,int k)
{
    if(pos<0)return y;
    if(z&&k&&dp[pos][x][y]!=-1)return dp[pos][x][y];
    int now=z?9:num[pos],i;
    ll ret=0;
    rep(i,0,now)ret+=dfs(pos-1,x,!i&&!k?y:(i==x?y+1:y),z||i<num[pos],k||i);
    return z&&k?dp[pos][x][y]=ret:ret;
}
void gao(ll x,ll y)
{
    pos=0;
    while(y)num[pos++]=y%10,y/=10;
    int i;
    rep(i,0,9)ans[i]=0,ans[i]+=dfs(pos-1,i,0,0,0);
    pos=0;
    while(x)num[pos++]=x%10,x/=10;
    rep(i,0,9)ans[i]-=dfs(pos-1,i,0,0,0);
}
int main()
{
    int i,j;
    memset(dp,-1,sizeof(dp));
    scanf("%lld%lld",&p,&q);
    gao(p-1,q);
    rep(i,0,9)printf("%lld\n",ans[i]);
    return 0;
}
时间: 2025-01-11 13:25:31

数字0-9的数量的相关文章

输入一批整数,输出其中的最大值和最小值,输入数字0就结束循环。如下所示

import java.util.Scanner; /** * 输入一批整数,输出其中的最大值和最小值,输入数字0就结束循环.如*下所示 请输入一个整数(输入0结束):20 请输入一个整数(输入0结束):35 * 请输入一个整数(输入0结束):1 请输入一个整数(输入0结束):57 请输入一个整数(输入0结束):0 最大值是:57 最小值是:1 */ public class Max { public static void main(String[] args) { Scanner sc =

字符0,数字0,‘\0’,NULL

\0是一个转义字符,将字符0转义为数字0.

编程题:将数字0~5放入一个整型数组,并逆序输出数组

#include<stdio.h> void main() { int i,a[5]; for(i=0;i<5;i++)         /*给数组中元素赋值*/ a[i]=i; for(i=4;i>=0;i--)          /*逆序输出数组中元素值*/ printf("%3d",a[i]); printf("\n"); } 编程题:将数字0~5放入一个整型数组,并逆序输出数组,布布扣,bubuko.com

空暇时候思考2(&amp;#39;\0&amp;#39;等价于数字0还是字符0)

/********************************************************************** * * Copyright (c)2015,WK Studios * * Filename: A.h * * Compiler: GCC vc 6.0 * * Author:WK * * Time: 2015 6 7 * *******************************************************************

字符串分隔 -&gt;连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组; ?长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。

?连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组:?长度不是8整数倍的字符串请在后面补数字0,空字符串不处理. 输入描述: 连续输入字符串(输入2次,每个字符串长度小于100) 输出描述: 输出到长度为8的新字符串数组 输入例子: abc 123456789 输出例子: abc00000 12345678 90000000 import java.util.*; public class Main{     public static void main(String[] ar

空闲时候思考2(&#39;\0&#39;等价于数字0还是字符0)

/********************************************************************** * * Copyright (c)2015,WK Studios * * Filename: A.h * * Compiler: GCC vc 6.0 * * Author:WK * * Time: 2015 6 7 * *******************************************************************

18.n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始, 每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。 当一个数字删除后,从被删除数字的下一个继续删除第m个数字。 求出在这个圆圈中剩下的最后一个数字。

转载请注明出处:http://www.cnblogs.com/wuzetiandaren/p/4263868.html 声明:现大部分文章为寻找问题时在网上相互转载,此博是为自己做个记录记录,方便自己也方便有类似问题的朋友,本文的思想也许有所借鉴,但源码均为本人实现,如有侵权,请发邮件表明文章和原出处地址,我一定在文章中注明.谢谢. 题目:n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始, 每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字). 当一个数字

统计页码数字0~9分别出现了多少次

最简单的方法是依次遍历每个数字,但这种算法时间复杂度太高,若再用上递归,数字一大内存就爆了,时空复杂度都很高,令人无法忍受. 因此探索出一种目前为止比较满意的方法. 思路来自<编程之美>计算数字1的个数(友情提示:若没有看过请先预习,方便理解以下代码),拓展一下即可(特别要注意的是计算数字0,它不可能出现在最高位).时间复杂度为O(logn+1),空间复杂度O(1). 这里用的语言是C++,已经过数据集测试. //程序格式(输入:long long范围内的正整数:输出:0~9每位数字出现的次数

【编程题目】n 个数字(0,1,…,n-1)形成一个圆圈,从数字 0 开始

第 18 题(数组):题目:n 个数字(0,1,…,n-1)形成一个圆圈,从数字 0 开始,每次从这个圆圈中删除第 m 个数字(第一个为当前数字本身,第二个为当前数字的下一个数字).当一个数字删除后,从被删除数字的下一个继续删除第 m 个数字.求出在这个圆圈中剩下的最后一个数字. 思路:看到这道题,直觉是不难,模拟一下过程就好了.我用的是数组来表示的,用first表示当前第一个数字是哪一个数,若删除一个数字则将后面的数字平移到前面. /* 第 18 题(数组): 题目:n 个数字(0,1,…,n

字符0、数字0和‘\0’

字符0.数字0和'\0'的区别 Bin(二进制) Oct(八进制) Dec(十进制) Hex(十六进制) 缩写/字符 解释 0000 0000 0 0 00 NUT(null) 空字符 00110000 60 48 30 0 字符0 ASCII码中 十进制数 0 表示空字符,空字符就是平时所说的 '\0'. 字符 0,ASCII码值为 十进制数 48,如:"012" 字符串中的 0 表示字符 0. 数字 0, 所说的数字 0,就是平时说的十进制数字 0,在字符串中表示 '\0',即空字