題目描述
只包含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;
}