AtCoder Beginner Contest 164 D Multiple of 2019

题目链接

题目描述

只包含1-9数字的字符串中,有多少子串形成的数字 % 2019 == 0

思路

因为 10n % 2019 == 0, 所以当 s[l~n] % 2019 == s[r~n] % 2019 就满足要求。(n为字符串长度)
证明:
因为 s[l, r] * 10r-l = s[l, n] - s[r, n] ([l, n] => l ~ n)
若 (s[l, n] - s[r, n]) % 2019 == 0;
=> s[l, r] * 10r-l % 2019 == 0;
因为 10r-l % 2019 != 0
所以 s[l, r] % 2019 == 0;
所以 s[l, n] % 2019 == s[r, n] % 2019

结论:统计从第一位到第n位s[i, n] % 2019 的余数,加上相同的余数即可

代码

#include
using namespace std;

int cnt[2010];

void solve() {
	string s;
	cin >> s;
	int num = 0, t = 1, res = 0;
	cnt[0] = 1;
	for(int i = s.size() - 1; ~i; i--) {
		num = (num + (s[i] - '0') * t) % 2019;
		res += cnt[num]++;
		t = t * 10 % 2019;
	}
	printf("%d\n", res);
}

int main() {
//	freopen("in.txt", "r", stdin);
	solve();
	return 0;
}

你可能感兴趣的:(AtCoder)