【每日一题】数码

数码

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

Solution

数论分块,就是利用一段区间内的数整除同一个数结果相同的性质减少运算量的技巧。

回到题目,要求区间 内的答案。已知的是 内数 当做约数的次数为 ,所以问题可以转化为区间 与区间 的答案之差。

暴力计算的话,时间复杂度是 的,不能承受。所以使用数论分块来减少计算量:由于整除向下取整的性质,所以必然存在很多段区间,区间内部整除结果相同,可以合并计算。具体的分块方法:将 作为整个区间。证明过程可以百度。( 好难)

由于本题要求只统计最高位,所以可以将每一位分开处理,方便计算。

时间复杂度:

Code

#include <iostream>
#include <cstdio>
#define ll long long
using namespace std;
ll Ask(ll u,ll r){
    ll x,y,ans=0;
    for(ll i=1;i<=r/u;i*=10){
        x=u*i,y=min(r,x+i-1);
        for(ll j=x,k;j<=y;j=k+1){
            k=min(y,r/(r/j));
            ans+=(k-j+1)*(r/j);
        }
    }
    return ans;
}
int main(){
    ios::sync_with_stdio(false);
    ll l,r;
    cin>>l>>r;
    for(int i=1;i<=9;i++)
        cout<<Ask(i,r)-Ask(i,l-1)<<endl;
    return 0;
}
全部评论

相关推荐

07-02 13:50
闽江学院 Java
点赞 评论 收藏
分享
05-26 22:25
门头沟学院 Java
Java小肖:不会是想叫你过去把你打一顿吧,哈哈哈
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-03 18:22
投了几百份简历,专业和方向完全对口,都已读不回。尝试改了一下学校,果然有奇效。
steelhead:这不是很正常嘛,BOSS好的是即便是你学院本可能都会和聊几句,牛客上学院本机会很少了
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务