时间限制: 1 s 空间限制: 256 MB
题目描述
Jimmy 对数字有着异于常人的热爱。有一天,他随便写出来一个数字—— 04320,然后开始对着这个数字写写画画。他发现,从这个数字中随便选出连续的一段(Jimmy 把这个称为连续子串),有可能是 4 的倍数,例如 4,04,32,432 等;也有可能是 5 的倍数,例如 20,320 等。
Jimmy 的老师恰好路过此处,他向正沉迷于自己发现的 Jimmy 提了一个有趣的问题——给定一个指定的数字串,请问有多少连续子串是 4 或者 5 的倍数呢?
老师还特别提醒他:
- 连续子串的开头可以是 0;
- 两个连续子串只要是从数字串中的不同位置选出来的,它们就算是不同的;
- 如果一个连续子串同时是 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见祖宗