【牛客】数码(思维)

博客介绍了如何高效地计算在给定区间内每个数码作为首位出现的次数,避免暴力求解,通过分析数码5的出现情况,推导出在更大范围内高位数码的计算方法,涉及数论和算法优化。
摘要由CSDN通过智能技术生成

戳这里呀~ 题目传送门

题目描述:

给定两个整数 l 和 r ,对于所有满足1 ≤ l ≤ x ≤ r ≤ 10^9 的 x ,把 x
的所有约数全部写下来。对于每个写下来的数,只保留最高位的那个数码。求1~9每个数码出现的次数。

输入描述:

一行,两个整数 l 和 r (1 ≤ l ≤ r ≤ 10^9)。 输出描述: 输出9行。
第 i 行,输出数码 i 出现的次数。

示例1
输入

1 4

输出

4
2
1
1
0
0
0
0
0

  • 这是某位学长灰常辛苦呕心沥血给我讲的,再次感谢~ 打卡第一天~

    首先分析一下思路:

  • 可以看出这道题的数去范围很大达到1e9,所以不考虑暴力。

  • 先假设求数码5在区间(l,r)出现的次数ans,即求在区间(l,r)中所有约数首位是5的个数,然后我们可以想到:可以首先求出(1,r)中数码5出现的次数,然后减去(1,l-1)区间内5出现的次数,这样即可得到ans。

  • 依旧先假设数码为5,则求区间内的首位为5的个数,即为求集合(集合内所有数皆在范围内,且首位都为5)

{
5;
50,51,52…58,59;
500,501,502…550…598,599;
5000,5001,5002…5550…5998,5999;
…}

内所有数的倍数之和;

可以看出来区间长度是9 ,99,999…递增的。

  • 分析到这里,我们可以想到可以在集合内的 每个小区间内枚举每个数的约数 ,然后相加求得。
    代码如下:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll solve(ll r,ll x)//r为距离,x是1~9
{
   
    ll ans=r/x; //先计算区间内满足x是因子的数字的个数;
    ll st=x*10,</
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值