主页
搜索
最近更新
数据统计
申请密钥
系统公告
1
/
1
请查看完所有公告
B4185 [中山市赛 2024] 倍数子串 题解
最后更新于 2025-06-22 17:15:49
作者
__sunhy2012__
分类
题解
题解
B4185
复制 Markdown
查看原文
删除文章
更新内容
# B4185 \[中山市赛 2024] 倍数子串 题解 ### 1. 读题 - 其实关键句就一句:请问有多少**连续子串**是 4 或者 5 的倍数呢? - 0 也是 4 或者 5 的倍数。 - 如果一个连续子串同时是 4 和 5 的倍数,应当只被计算一次 --- ### 2. 解题思路 - 逐一遍历字符串并进行判断,末尾是 0 或 5 的数为 5 的倍数,后两位能被 4 整除,为 4 的倍数。答案用变量 ans 记录。 --- ### 3. 代码片段分析 1. 遍历字符串: ``` for(int i=s.size()-1;i>=0;i--) ``` 3. 计算是否为 5 的倍数: ``` if(s[i]=='5'||s[i]=='0')//如果是 0 或 5,则为 5 的倍数。 ans=ans+i+1;//累加。 ``` 3. 计算是否为 4 的倍数: ``` //减去字符 0 可以将字符转换为数字。 else if(((s[i]-'0')+(s[i-1]-'0')*10)%4==0){//判断末两位是 4 的倍数 ans=ans+i+1; ``` 4. 对于 4 的倍数需要特判 > 如果数字为 4 或 8 ,那么这个数也是 4 的倍数,但以其为末尾的数不一定是 4 的倍数,且以该数的这一位和上一位组成的十位数不一定为 4 的倍数,要特判。 1.`if(s[i]=='2'||s[i]=='6')ans--;` 2.`if(s[i]=='4'||s[i]=='8')ans++;` ### 4. AC 代码 代码片段中基本就是全部代码,如果你是[这种情况](https://www.luogu.com.cn/record/206949687),我只能引用一句 OI 界的名言: > 十年 $\operatorname{OI}$ 一场空,不开 $\operatorname{long\hspace{1mm}long}$ 见祖宗
正在渲染内容...
点赞
0
收藏
0