「美团 CodeM 资格赛」数码 详解
❓问题描述
3142: #6083. 「美团 CodeM 资格赛」数码
Time Limit: 1 Sec Memory Limit: 256 MB
Description
给定两个整数 l 和 r,对于任意 x,满足 l≤x≤r ,把 x 的所有约数全部写下来。对于每个写下来的数,只保留最高位的那个数码。求[1,9]中每个数码出现的次数。
输入格式
输入一行两个整数 l 和 r。
输出格式
一共 9 行。
第 i 行,输出数码 i 出现的次数。
样例
样例输入
1 4
样例输出
4 2 1 1 0 0 0 0 0
数据范围与提示
1≤l≤r≤10^9
💡思路 1
暴力想 从 只有 1 位数开始 然后 2 位 3 位 。。。。枚举到边界限对于最高位数位 1 的来说有 1 10 11 12 … 19 100 101 102 … 199 …. 假设我们求得区间是 1-k 。这样的话答案就是 k/1 + k/10 + k/11 + … k/199。 确实减少了计算量,倒是但枚举到 10000000 的时候就不合适了,再按上述方法枚举次数就太多了。
这个时候分母变得很大,可以利用这个特性来进行分块,例如 k/10000000 与 k/10009999 结果可能都一样(向下取整)。 我们可以将答案都相同的分为一块,这样枚举因子的时候就可以滑动了,从 10000000 直接滑倒 10009999。
代码
💡思路 2
需要一定的思维过程 直接读代码就好咯 下图为确定区间的长度示意图
代码
版权声明: 本文为 InfoQ 作者【Five】的原创文章。
原文链接:【http://xie.infoq.cn/article/6db807144130fe6ef17907856】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论