1591. 【中山市第十二届义务教育段学生信息学邀请赛】倍数子串(timestr)

时间限制: 1 s 空间限制: 256 MB  

题目描述

Jimmy 对数字有着异于常人的热爱。有一天,他随便写出来一个数字—— 04320,然后开始对着这个数字写写画画。他发现,从这个数字中随便选出连续的一段(Jimmy 把这个称为连续子串),有可能是 4 的倍数,例如 4,04,32,432 等;也有可能是 5 的倍数,例如 20,320 等。

Jimmy 的老师恰好路过此处,他向正沉迷于自己发现的 Jimmy 提了一个有趣的问题——给定一个指定的数字串,请问有多少连续子串是 4 或者 5 的倍数呢?

老师还特别提醒他:

  1. 连续子串的开头可以是 0;
  2. 两个连续子串只要是从数字串中的不同位置选出来的,它们就算是不同的;
  3. 如果一个连续子串同时是 4 和 5 的倍数,应当只被计算一次哦!
输入

一行一个数字串,长度为 n。

输出

一行一个整数,表示所有的连续子串中,为 4 或者 5 的倍数的数量。

样例数据
输入 #1 复制
04320
输出 #1 复制
11
输入 #2 复制
2000
输出 #2 复制
9
数据范围限制

对于 10% 的数据,保证 n=1。

对于 60% 的数据,保证 1≤n≤103。

对于 100% 的数据,保证 1≤n≤106。

提示

【样例 1 解释】

所有满足题意的连续子串分别为:0,04,0432,04320,4,432,4320,32,320,20,0。其中有两个相同的 0,这是因为它们是从数字串中的不同位置选出来的(一个在开头处,一个在结尾处)。

用数学方法做就行,特判亿下就行.

代码
#include <bits/stdc++.h>
using namespace std;
char c[1005001]; 
int main()
{
	scanf("%s",c);
	int n=strlen(c);
	long long sum=0;
	for(int i=0;i<n;i++)
	{
		if((c[i]-'0')%5==0)
		{
			sum+=i+1;
		}
		else if((c[i]-'0'+(c[i-1]-'0')*10)%4==0)
		{
			if((c[i]-'0')%4==0) sum++;
			sum+=i;
		}
		else if((c[i]-'0')%4==0) sum++;	
	}
	printf("%lld",sum);
	return 0;
}

不开long long见祖宗

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值