6的倍数
题目描述
兔兔给你一个十进制正整数n,问你可以从n中截取多少个不同的子串(连续的若干字符),使得子串构成的数字是6的倍数。
例如:当n=1234时,有且仅有12和234这两个子串是6的倍数。
两个子串只要开始或结束位置有不同,即使内容一样也认为是不同子串,不用考虑高位0的问题,006也算合格的子串。
输入格式
单个整数:表示输入的数字n
输出格式
单个整数:表示6的倍数的子串数量。
样例 #1
样例输入 #1
1234
样例输出 #1
2
提示
对于 20% 的数据,1≤n≤109
对于 50% 的数据,1≤n≤10100
对于 70% 的数据,1≤n≤101000
对于 100% 的数据,1≤n≤10106
#include <bits/stdc++.h>
using namespace std;
int a[3]={1};
int main()
{
string s;
int sum=0,cur,i;
long long ans=0;
cin>>s;
for(i=0;i<=s.size()-1;i++)
{
cur=s[i]-'0';
sum=(sum+cur)%3;
if(!(cur&1))
{
ans+=a[sum];
}
a[sum]++;
}
cout<<ans<<endl;
return 0;
}