zoukankan      html  css  js  c++  java
  • POJ2282 The Counting Problem

    题意

    Language:
    The Counting Problem
    Time Limit: 3000MSMemory Limit: 65536K
    Total Submissions: 5070Accepted: 2590

    Description

    Given two integers a and b, we write the numbers between a and b, inclusive, in a list. Your task is to calculate the number of occurrences of each digit. For example, if a = 1024 and b = 1032, the list will be
    1024 1025 1026 1027 1028 1029 1030 1031 1032

    there are ten 0's in the list, ten 1's, seven 2's, three 3's, and etc.

    Input

    The input consists of up to 500 lines. Each line contains two numbers a and b where 0 < a, b < 100000000. The input is terminated by a line `0 0', which is not considered as part of the input.

    Output

    For each pair of input, output a line containing ten numbers separated by single spaces. The first number is the number of occurrences of the digit 0, the second is the number of occurrences of the digit 1, etc.

    Sample Input

    1 10
    44 497
    346 542
    1199 1748
    1496 1403
    1004 503
    1714 190
    1317 854
    1976 494
    1001 1960
    0 0
    

    Sample Output

    1 2 1 1 1 1 1 1 1 1
    85 185 185 185 190 96 96 96 95 93
    40 40 40 93 136 82 40 40 40 40
    115 666 215 215 214 205 205 154 105 106
    16 113 19 20 114 20 20 19 19 16
    107 105 100 101 101 197 200 200 200 200
    413 1133 503 503 503 502 502 417 402 412
    196 512 186 104 87 93 97 97 142 196
    398 1375 398 398 405 499 499 495 488 471
    294 1256 296 296 296 296 287 286 286 247
    

    Source

    求出区间内0~9的个数

    分析

    参照hncu__lz的题解。

    建立f(k)和f(10*k+x)的关系,也就是说对于一个大数,先处理到末尾为0,然后再认为是从0开始10个10个数数到这个数。例如,f(2984)就先从2981数到2984(2,9,8各出现4次,1,2,3,4一次)然后f(2980)可以和f(298)建立递推(实际的时候用f(297)更好一点)。注意这里需要建立一个“乘子”,一开始为1,每次递推一层就*10,然后累加到0-9的记录上。

    比较巧妙的一个统计转移,详见代码。我发现要找出这类计数问题的步骤含义的最好方法就是模拟一遍。

    时间复杂度(O(lg n))

    代码

    #include<iostream>
    #include<cstring>
    #define rg register
    #define il inline
    #define co const
    template<class T>il T read(){
        rg T data=0,w=1;rg char ch=getchar();
        while(!isdigit(ch)) {if(ch=='-') w=-1;ch=getchar();}
        while(isdigit(ch)) data=data*10+ch-'0',ch=getchar();
        return data*w;
    }
    template<class T>il T read(rg T&x) {return x=read<T>();}
    typedef long long ll;
    using namespace std;
    
    void dfs(int n,int*f,int x){
    	if(n<=0) return;
    	int w=n%10+1;
    	for(int i=1;i<w;++i) f[i]+=x; //不从0开始是方便下面第3个for循环
    	for(int z=n/10;z;z/=10) f[z%10]+=w*x; //尾数 0到d 对应有多少高位
    	for(int i=0;i<=9;++i) f[i]+=n/10*x; // [0,n/10) 其中末尾为0的特殊分配到n/10 
    	dfs(n/10-1,f,x*10);
    }
    int main(){
    	for(int x,y;read(x)|read(y);){
    		static int a[10],b[10];
    		memset(a,0,sizeof a),memset(b,0,sizeof b);
    		if(x>y) swap(x,y);
    		if(--x<y) dfs(y,b,1),dfs(x,a,1);
    		for(int i=0;i<9;++i) printf("%d ",b[i]-a[i]);
    		printf("%d
    ",b[9]-a[9]);
    	}
    	return 0;
    }
    
  • 相关阅读:
    2018徐州网络赛H. Ryuji doesn't want to study
    P3388 【模板】割点
    数列分块入门 1 LOJ6277
    P2261 [CQOI2007]余数求和
    模拟微信小程序页面Page方法
    .Net Newtonsoft.Json 转json时将枚举转为字符串
    .NET CORE 中使用AutoMapper进行对象映射
    .NetMvc从http或本地下载pdf文件
    js给多级复杂动态变量赋值
    微信三方平台开发上传base64格式图片至临时素材
  • 原文地址:https://www.cnblogs.com/autoint/p/10804267.html
Copyright © 2011-2022 走看看