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;
}
原文地址:https://www.cnblogs.com/Kanoon/p/12782687.html