每日一题 4.6 数码

数码

https://ac.nowcoder.com/acm/problem/13221

蒟蒻的学习题解
这题一开始我是只会暴力求每个数的约数的 然后肯定超时了
经学习后 我写出了以下程序
主要用了分段处理和把区间转化 x/i就是1-x中含有i的因数的数的个数(重点)
详细的解释在代码里

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll l,r,ans,s,w;
ll f(ll r,ll x)             ///x/i就是1-x中含有i的因数的数的个数
{
    ans=r/x;                   ///计算当约数最高位为x时的次数
    s=x*10,w=min(r,x*10+9);    ///确定区间上界和下界  s 下  w 上
    for(;s<=r;s*=10,w=w*10+9)  ///一个个区间的算
    {
           w=min(w,r);
        for(ll i=s;i<=w;)
        {
          ll sum=r/i;
          ll z=min(r/sum,w);     ///区间跳  z为i 注意可能超过上界
          ans+=sum*(z-i+1);
          i=z+1;       ///区间内跳转
        }
    }
    return ans;
}
int main(){
    cin>>l>>r;
    for(int i=1;i<=9;i++){
        cout<<f(r,i)-f(l-1,i)<<endl;
    }
    return 0;
}
每日一题题解 文章被收录于专栏

每日一题题解的汇集

全部评论

相关推荐

喜欢吃蛋糕仰泳鲈鱼是我的神:字节可以找个hr 给你挂了,再放池子捞
点赞 评论 收藏
分享
我见java多妩媚:大外包
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务