AtCoder Beginner Contest 164
比赛链接:https://atcoder.jp/contests/abc164
A - Sheep and Wolves
#include <bits/stdc++.h> using namespace std; int main() { int s, w; cin >> s >> w; cout << (w >= s ? "unsafe" : "safe"); }
B - Battle
#include <bits/stdc++.h> using namespace std; int main() { int a, b, c, d; cin >> a >> b >> c >> d; int c1 = c / b + (c % b > 0); int c2 = a / d + (a % d > 0); cout << (c1 <= c2 ? "Yes" : "No"); }
C - gacha
#include <bits/stdc++.h> using namespace std; int main() { int n; cin >> n; set<string> st; for (int i = 0; i < n; i++) { string s; cin >> s; st.insert(s); } cout << st.size(); }
D - Multiple of 2019
题意
求一个至多长为 200000 的只包含 1 ~ 9 的字符串中有多少连续子串转为 10 进制后为 2019 的倍数。
思路
始终以字符串右端为起点向左扩展得到一系列整数: $x_i = s_i*10^{i}\ +\ s_{i-1}*10^{i-1}\ +\ ...\ +\ s_{0}10^0$,将 x 对 2019 取模,如果有两个 x 同余,则两个 x 之间的数,即二者之差一定为 2019 的倍数,用一个数组记录每个余数之前出现的次数,每个 x 与之前同余的数间都可以构成 2019 的倍数,如果余数为 0 则 x 本身就可以作为 2019 的倍数,所以 cnt[0] 初始化为 1 。
#include <bits/stdc++.h> using namespace std; int cnt[2019]; int main() { string s; cin >> s; int ans = 0, now = 0, p = 1; cnt[0] = 1; for (int i = s.size() - 1; i >= 0; i--) { now = (now + (s[i] - '0') * p) % 2019; ans += cnt[now]++; p = p * 10 % 2019; } cout << ans; }