【每日一题】枚举优化 数码 待补题

https://ac.nowcoder.com/discuss/399522?type=101&order=0&pos=14&page=2

#include <bits/stdc++.h>
using namespace  std;
#define int long long
int l, r, a[20], b[20];
int shou(int x)
{
    int ans = 0 ;
    while (x>0)
    {
        ans = x % 10;
        x /= 10;
    }
    return ans;
}
void calc(int r, int *a)
{
    for (int i = 1; i * i <= r; i++)    //枚举一个因子a
    {
        int b = r/i;                //b的范围左界是i+1(为了不算重复),右界是r/i
        for (int j = 1; j <= r; j *= 10)   //枚举位数(直接用1后面若干个0,方便后面计算)
        {
            for (int k = 1; k <= 9; k++)   // 枚举首位数
            {
                int x = max(j*k, i+1);      //x是最高位为k的时候的下界
                int y = min((j *(k+1)) -1, b);  //y是上界
                if (y-x>=0) a[k] += y-x+1;  //这个区间存在,算个数
            }
        }
        int tmp = shou(i);          //算a的首位
        a[tmp] += b-i+1;            //算用了多少个a
    }
}

signed  main()
{
    scanf("%lld%lld", &l, &r);
    calc(r, a);
    calc(l - 1, b);
    for(int i = 1; i <= 9; ++i)
        printf("%lld\n", a[i]-b[i]);
    return 0;
}
全部评论

相关推荐

01-29 15:45
已编辑
华中科技大学 前端工程师
COLORSN:可以试一下,小厂看技术栈是不是很落后,如果太拉胯就别去,个人认为有实习氛围比你自己琢磨要高效不少,然后就是小厂其实也有可能会问的很难,这都比较难说,还是看自己项目含金量够不够,寒假还能不能推进学习再选择,毕竟去实习过年就10天假了
点赞 评论 收藏
分享
累死的一条狗:***一人顶10人那你给我发10个人的工资总和吗
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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