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;
}

浙公网安备 33010602011771号