戳这里呀~ 题目传送门
题目描述:
给定两个整数 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,</