当前位置: 首页 > news >正文

【题解】Luogu B4185 [中山市赛 2024/科大国创杯小学组 2023] 倍数子串/子串

明明是很容易的题模拟赛却没注意到。

数学、模拟

题意

略。

思路

不妨从 \(5\) 下手。一数仅当最后一位是 \(0\)\(5\) 时,该数才是 \(5\) 的倍数。因此如果第 \(i\) 位是 \(0\)\(5\),所有最后一位是 \(5\) 的连续子串都满足条件,子串数量 \(+i\)

同理,由于 \(100\)\(4\) 的倍数,所以一数只需后两位是 \(4\) 的倍数,该数就是 \(4\) 的倍数。因此如果第 \(i\)\(i-1\) 位构成了 \(4\) 的倍数,则所有以此两位结尾的子串也都满足条件,子串数量 \(+i-1\)。特别地,当第 \(i\) 位或第 \(i-1\) 位是 \(4\)\(8\) 时,这两位也应参与计数。

考虑一个更优化的做法。一个两位数是 \(4\) 的倍数有两种情况:末位为 \(2\)\(6\) 和末位为 \(4\)\(8\)。通过观察不难得出,第一种情况仅十位是奇数时成立,第二种情况仅十位是偶数时成立。这样在代码求解时会更简洁。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#define int long long
using namespace std;
const int N=1e6+10;
int n,ans;
char s[N];
signed main(){scanf("%s",s+1);n=strlen(s+1);for(int i=1;i<=n;i++){if(s[i]=='0'||s[i]=='5') ans+=i;else if(s[i]=='4'||s[i]=='8'){if((s[i-1]-'0')%2) ans+=1;else ans+=i;}else if(s[i]=='2'||s[i]=='6'){if((s[i-1]-'0')%2) ans+=i-1;} }printf("%lld\n",ans);return 0;
}

时间复杂度 \(O(n)\)

http://www.jsqmd.com/news/79146/

相关文章:

  • JavaScript 异常原因(Error Cause):实现分布式系统错误链追踪的序列化与反序列化
  • 毕业论文任务书范文推荐:7大平台+AI修改工具
  • Python字典与集合:解锁高效数据处理的关键,90%的人没吃透这几点
  • 天远多头借贷行业风险版API接口调用代码流程、接入方法以及应用场景
  • 详细介绍:完整事务性能瓶颈分析案例:支付系统事务雪崩优化
  • 计算机论文选题推荐:9大AI+热门方向排名
  • JavaScript 记录(Records)与 元组(Tuples):实现堆内存中不可变复合数据结构的内存布局
  • 5 分钟快速入门 Github Actions
  • 虚函数虚表
  • 线程并发编程,同步与互斥机制
  • Python列表与元组:搞懂这3个核心差异,再也不纠结用哪个
  • MQ消息队列相关知识与对比
  • 已有析音法
  • 完整教程:PPT导出为图片的格式选择:JPG与PNG的区别
  • 不能头脑简单地搞“凡是”:凡是偶数2n(n的变域是N)必∈N
  • Docker 两大基石:Namespace 和 Cgroups
  • 告别排版困境!AI 写作到发布全自动化的完整方案
  • 9、Eclipse集成开发环境:C/C++开发全流程指南
  • 享搭提醒助手:数据变动实时预警,运营者业务状态“尽在掌握”
  • Python银行客户数据流失预测SMOTE平衡数据实现神经网络、SVM、决策树、随机森林与超参数调优|附代码数据
  • 音元系统:绪论
  • 代码随想录算法训练营第三十二天 | 完全背包、518. 零钱兑换 II、377. 组合总和 Ⅳ、卡码网57. 爬楼梯
  • 【题解】CSP-J/S 2025 补题
  • 音元系统:摘要
  • 26 avl树(下)
  • 从“写代码”到“定义问题”——AI 时代程序员的生存宣言
  • 音元系统:目录
  • 最全词典整合收录:打造专业英语学习利器
  • Java毕业设计不会做怎么办?
  • 基于深度学习的文物图像修复系统