K倍子串——余数应用

 时间限制: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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值