StkOvflow

STACK OVERFLOW!

一言(ヒトコト)

成为很厉害很厉害的人,最重要的,就是要热血,永远也不要让你的血凉下去。
——hzwer

AcWing3400. 统计次数

题目描述

给定两个正整数 nk,求从 1nn 个正整数的十进制表示中 k 出现的次数。

输入格式

共一行,包含两个整数 nk

输出格式

输出一个整数,表示答案。

数据范围

1n106,
1k9

输入样例:

    12 1

输出样例:

    5

样例解释

112 这些整数中包含 1 的数字有 1,10,11,12,一共出现了 51

解题思路

看到题目看似挺复杂的,那就先从暴力的角度思考:
我们可以从1枚举到n,把每个数的每一位分解出来,然后判断是不是k就行。

我们有n次循环,每次循环内部的复杂度也就是log10i,最后的复杂度总和就是i=1nlog10i
也就是log10i=1n
也就是log10(n!)
这个复杂度是绰绰有余的,在desmos上画了下图
image
蓝色的是log10(n!),红色是nlog10n
所以跑得过,上代码

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 10;
int cnt[N], res;

int main() 
{
    int n, k;
    scanf("%d%d", &n, &k);
    
    for (int i = 1; i <= n; i ++ ) 
    {
        int x = i;
        while (x) 
        {
            res += (x % 10 == k);
            x /= 10;
        }
    }
    printf("%d\n", res);
    
    return 0;
}
posted @   StkOvflow  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示