Competitive Programmer 题解

发布时间 2023-06-08 22:27:28作者: xvl

题目传送门

一道模拟题。

纯模拟肯定不行,考虑优化。\(60 = 2^2 \times 3 \times 5\),也就是说我们判断组合后的数字能否被 \(2\)\(3\)\(10\) 整除即可。

如果这个数能被 \(2\) 整除,那么原数一定会存在偶数;如果这个数能被 \(3\) 整除,那么它的数字和应该也能被 \(3\) 整除;如果这个数能被 \(10\) 整除,那么原数一定存在 \(0\)

值得注意的是,如果原数只出现过一个 \(0\),那么该数是不能被 \(10\)\(2\) 同时整除的。因此,我们还需要判断一下原数是否有除了 \(0\) 以外的偶数或者 \(2\) 个以上的 \(0\)

Code

#include <bits/stdc++.h>
#define ll long long
#define INF 1e9
using namespace std;
int n;
signed main() {
    ios :: sync_with_stdio(0);
    cin >> n;
    for (int i = 1; i <= n; i++) {
        string s; // 不要用 int,否则会出错
        int sum = 0, cnt1 = 0, cnt2 = 0; // sum 是数位和,cnt1 是 0 的个数,cnt2 是除了 0 以外的偶数的个数
        bool flag1 = 0, flag2 = 0, flag3 = 0; // flag1 判断能否被 3 整除,flag2 判断能否被 10 整除,flag3 判断能够被 2 整除
        cin >> s;
        for (int i = 0; i < s.size(); i++) {
            int num = s[i] - '0';
            sum += num;
            if (num == 0) cnt1++;
            else if (num % 2 == 0) cnt2++;
        }
        if (sum % 3 == 0) flag1 = 1;
        if (cnt1) flag2 = 1;
        if (cnt2 or cnt1 > 1) flag3 = 1; // 如果有两个 0 也可以
        if (flag1 and flag2 and flag3) cout << "red\n";
        else cout << "cyan\n";
    }
    return 0;
}