时间限制:1s 内存限制:128M
题目描述:
给定一个只包含数字字符的字符串 s和一个十进制正整数 k。请问可以从 s中截取多少个子串,使得构成子串所包含的数码和是 k的倍数。
例如:当 s ="5764",k=3时,有且仅有 6,57,576 这三个子串是 3 的倍数,因为 6是 3的倍数, 5+7=12 是 3 的倍数, 5+7+6=18 是 3的倍数。
输入格式:
第一行一个字符串 s;
第二行一个整数 k。
输出格式:
一行一个整数,表示 k的倍数的字串数量。
【输入输出样例1】
输入:
1234
3
输出:
4
【输入输出样例2】
输入:
12345
2
输出:
6
【输入输出样例3】
输入:
101010101
2
输出
20
【数据范围】
对于 20% 的数据: 1≤∣s∣≤10;
对于 40% 的数据: 1≤∣s∣≤100;
对于 70% 的数据: 1≤∣s∣≤5000;
对于 100% 的数据: 1≤∣s∣,k≤1000000,其中 |s| 表示字符串 s的长度,s不含前导 0。
#include <bits/stdc++.h>
using namespace std;
int a[1000010],b[1000010];
int main()
{
string s;
cin >> s;
long long k,cnt = 0;
cin >> k;
for (int i = 1;i <= s.size();i++)
{
b[i] = b[i-1] + s[i-1] - '0';
a[b[i]%k] ++;
}
for (int j = a[0];j >= 1;j--) cnt += j;
for (int i = 1;i <= k-1;i++)
{
for (int j = a[i]-1;j >= 1;j--) cnt += j;
}
cout << cnt << endl;
return 0;
}