数码 美团资格赛(整数分块)
链接:https://ac.nowcoder.com/acm/contest/5/A
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
空间限制: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
输出
复制4 2 1 1 0 0 0 0 0
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }