数码 美团资格赛(整数分块)

链接:https://ac.nowcoder.com/acm/contest/5/A
来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

给定两个整数 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

 1 #include <bits/stdc++.h>
 2 #define ll long long
 3 using namespace std;
 4 ll l,r;
 5 
 6 ll cultwo(ll k,ll a,ll b){
 7     ll ans=0,j;
 8     for(ll i=a;i<=b;i=j+1){
 9         j=min(b,k/(k/i));
10         ans+=(j-i+1)*(k/i);   //区间约束的个数
11     }
12     return ans;
13 
14 }
15 
16 ll culone(ll ee,ll num){
17     ll shu=1,res=0;
18     for(;ee>=num;shu*=10,num*=10){
19         res+=cultwo(ee,num,min(num+shu-1,ee));
20     }
21     return res;
22 }
23 
24 int main(){
25     ios::sync_with_stdio(false);
26     cin>>l>>r;
27     for(int i=1;i<=9;i++){
28         cout << culone(r,i)-culone(l-1,i) << endl;
29     }
30     return 0;
31 }
View Code
原文地址:https://www.cnblogs.com/qq-1585047819/p/11545629.html