「美团 CodeM 资格赛」数码 详解

简介: 给定两个整数 l 和 r,对于任意 x,满足l≤x≤r ,把 x 的所有约数全部写下来。对于每个写下来的数,只保留最高位的那个数码。求[1,9]中每个数码出现的次数。输入格式输入一行两个整数 l 和 r。

❓问题描述

3142: #6083. 「美团 CodeM 资格赛」数码

Time Limit: 1 Sec  Memory Limit: 256 MB

Description

给定两个整数 l 和 r,对于任意 x,满足l≤x≤r ,把 x 的所有约数全部写下来。对于每个写下来的数,只保留最高位的那个数码。求[1,9]中每个数码出现的次数。

输入格式

输入一行两个整数 l 和 r。

输出格式

一共 9 行。

第 i 行,输出数码 i出现的次数。

样例

样例输入

1 4

样例输出

4 2 1 1 0 0 0 0 0

数据范围与提示

1≤l≤r≤10^9

💡思路1

暴力想 从 只有1位数开始 然后2位 3 位 。。。。枚举到边界限对于最高位数位1的来说有 1 10 11 12 … 19 100 101 102 … 199 …. 假设我们求得区间是 1-k 。这样的话答案就是 k/1 + k/10 + k/11 + … k/199。 确实减少了计算量,倒是但枚举到 10000000 的时候就不合适了,再按上述方法枚举次数就太多了。

这个时候分母变得很大,可以利用这个特性来进行分块,例如 k/10000000 与 k/10009999 结果可能都一样(向下取整)。 我们可以将答案都相同的分为一块,这样枚举因子的时候就可以滑动了,从10000000直接滑倒10009999。

 

代码

#include<stdio.h>#include<string.h>#define  ll long long#define min(a,b) a>b?b:a llres[11];
voidwork(llr,intf){
for(llu=1;u<=9;u++)//找 含 1~9的             {
for(llv=1;u*v<=r;v*=10)//从第只有一位数开始找 一直到超出r                 {
llp,Stat=u*v,End=min(u*v+v-1,r);//Stat End当前位数开始与结束 p当前步长 for(lli=Stat;i<=End;i+=p)
                    {
llyb=r/i,mod=r%i;
p=1; 
p+=min(mod/yb,End-i);//防止超界 res[u]+=f*(yb*p);
                    }
                }
            }
        }
intmain(){ 
lll,r;
while(scanf("%lld%lld",&l,&r)==2)
        {     memset(res,0,sizeof(res));
work(r,1);
work(l-1,-1);
for(intj=1;j<=9;j++)printf("%lld\n",res[j]);
        }
}

💡思路2

需要一定的思维过程 直接读代码就好咯   下图为确定区间的长度示意图

网络异常,图片无法展示
|

代码

#include<stdio.h>
#include<string.h>
#define ll long long 
ll res[11];
ll get_sum(ll zb,ll yb,ll x){
ll ans = 0;
    if(yb>x)yb=x;//当前右边界大于限定边界 更新掉 
    int k=x/yb; //  获取在限定边界中含有右边界值有多少个 
     int mod=x%yb;// mod 
    while(1){ 
    int d=(yb-mod)/(k+1);// 获得此段应该每一个小节应该减少的长度d(整数)此段宽度  
   // yb-d=x/(k+1) --> d=yb-x/(k+1)-->d=[yb(k+1)-x]/(k+1) 因为 x=yb*k+mod 所以 d=(yb-mod)/(k+1)
   // 找到范围内倍数个数同为k的左边界 
       if(d*(k+1)<(yb-mod)) d++;
       if(yb-d<zb)break;//结束条件 当前段的左边界 超出该步骤的左边界 
       ans+=k*d;//k*d 代表 此范围 有k个倍数的约数 有连续的d 个 
        ll yyb=yb;
        yb=yb-d;//更新当前段的左边界  
      mod=(k*d+mod)%yb;//更新当前段的mod值 c此时 yb 为 yb' 
  // mod=x/yb' --> x=yb*k+mod=(yb'+d)*k+mod=yb'*k+d*k+mod  --> mod= (d*k+mod)%yb'
        int k12=k;
       if(d==1)k=x/yb;//到了边界 
      else k++;//更新 k   
    }
    ans+=(yb-zb+1)*k;
  return ans;
}
void work(int x,int v){
  ll i;
  for(i=1;i<10;i++){
      ll w = 1;
    while(i*w<=x){
      ll end = i*w+w-1;
      res[i] += v*get_sum(i*w,end,x);
      w*=10;
    }
  } 
}
int main(){
     int n,m;
  while(~scanf("%d%d",&n,&m)){
    memset(res,0,sizeof(res));
    work(m,1);  
    work(n-1,-1);
    for(int i=1;i<10;i++)
    printf("%lld\n",res[i]);
  }
  return 0;
}
目录
相关文章
|
机器学习/深度学习 数据采集 搜索推荐
Paper Digest | 突破个性化推荐数据稀疏性:长尾增强的图对比学习算法研究
本文提出了一种新的长尾增强的图对比学习方法(LAGCL),该方法促使模型同时兼顾头部节点与尾部节点之间的知识,并通过长尾增强技术来使模型产出更均匀更准确的节点表征,从而改进基于 GNN 的推荐任务。
|
存储 索引
数据结构(顺序结构、链式结构、索引结构、散列结构)
数据结构(顺序结构、链式结构、索引结构、散列结构)
|
存储 内存技术
【核磁共振成像】临床基本通用脉冲序列(二)
【核磁共振成像】临床基本通用脉冲序列
|
JSON Java Apache
Bean自动映射工具对比及VO、DTO、PO、DO对象之间的转换
在实际的开发过程中,常常遇到各个层之间对象转换,比如 VO、DTO、PO、DO 等,而如果都是手动set、get,一旦属性较多时,操作起来不仅麻烦,而且浪费时间,因此经常会使用一些工具类,进行对象之间的转换,下面将对象与对象之间转换的方式进行对比,一级对象间的使用进行总结。
Bean自动映射工具对比及VO、DTO、PO、DO对象之间的转换
|
9月前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于PPO强化学习的buckboost升降压电路控制系统matlab仿真,对比PID控制器
本项目利用MATLAB 2022a对基于PPO强化学习的Buck-Boost电路控制系统进行仿真,完整代码无水印。通过与环境交互,智能体学习最优控制策略,实现输出电压稳定控制。训练过程包括初始化参数、收集经验数据、计算优势和奖励函数并更新参数。附带操作视频指导,方便用户理解和应用。
246 12
|
机器学习/深度学习 自然语言处理
谷歌发布时序预测基础模型TimesFM
【2月更文挑战第27天】谷歌发布时序预测基础模型TimesFM
902 3
谷歌发布时序预测基础模型TimesFM
|
11月前
|
XML API 开发者
亚马逊国际获得AMAZON商品详情 API接口
要获取亚马逊国际商品详情API接口,需先访问亚马逊开发者中心了解API文档,注册账号并创建应用获取API权限及密钥。接着,按文档构建请求URL,使用编程语言发送GET请求,接收并解析XML响应,从中提取商品详情信息,如名称、价格等,最终整合至应用中实现功能。如有疑问,欢迎联系。
|
Oracle 关系型数据库 Java
实时计算 Flink版操作报错合集之遇到了关于MySqIValidator类缺失的错误,是什么原因
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
Devops jenkins 测试技术
如何在Visual Basic项目中实施单元测试以确保代码健壮性
【7月更文挑战第2天】本文探讨了如何在Visual Basic项目中实施单元测试以确保代码健壮性。单元测试基础包括验证代码单元的功能,促进重构和提高代码质量。MSTest、NUnit和xUnit是VB.NET的单元测试工具。遵循TDD原则,保持测试独立,关注单一功能,并确保快速执行。示例展示了如何为`Calculator`类的加法方法编写MSTest。持续集成与自动化测试工具如Jenkins和Azure DevOps辅助测试运行和代码质量检查。单元测试是提升软件质量和开发效率的关键实践,反映了良好的开发文化。
179 2