U362820 GSEP 6级样题 亲朋数

GSEP 6级样题 亲朋数

题目描述

给定一串长度为L、由数字 0-9 组成的数字串S。容易知道,它的连续子串共有L(L+1)/2 个。如果某个子串对应的数(允许有前导零)是p的倍数,则称该子串为数字串S对于p的亲朋数。

例如,数字串S为“12342”、p为 2,则在 15 个连续子串中,亲朋数有“12”、“1234”、“12342”、“2”、“234”、“2342”、“34”、“342”、“4”、“42”、“2”等共 11 个。注意其中“2”出现了 2 次,但由于其在S中的位置不同,记为不同的亲朋数。

现在,告诉你数字串S和正整数p,你能计算出有多少个亲朋数吗?

输入格式

输入的第一行,包含一个正整数p。约定2 ≤ p ≤ 128。

输入的第二行,包含一个长为L的数字串S。约定1 ≤ L ≤ 106。

输出格式

输出一行,包含一个正整数C,表示亲朋数的个数。

样例 #1

样例输入 #1

2
102

样例输出 #1

5

样例 #2

样例输入 #2

2
12342

样例输出 #2

11

提示

样例解释1:

5 个亲朋数,分别为“10”、“102”、“0”、“02”、“2”。


#include <iostream>
#include <vector>

using namespace std;

// 超长整型取模
uint64_t M(string s, uint64_t n) {
	uint64_t r = 0;
	for (char c: s) {
		r *= 10;
		r += (c - '0');
		r %= n;
	}
	return r;
}

int main() {
	int n; cin >> n;
	string s; cin >> s;
	uint64_t ct = 0;
	for (size_t i = 0; i < s.length(); i++) {
		for (size_t j = 1; j <= s.length() - i; j++){
			if (M(s.substr(i, j), n) == 0) ++ct;
		}
	}
	cout << ct;
	
}

posted @   iamy  阅读(596)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示