Atcoder 164D 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;

結論:統計從第一位到第n位s[i, n] % 2019 的餘數,加上相同的餘數即可

代碼

#include<bits/stdc++.h>
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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章