1 条题解

  • 0
    @ 2026-5-19 16:57:31

    C. Uninteresting Number(无趣的数字)

    题目核心分析

    关键知识点

    一个数能被 99 整除的充要条件:它的各位数字之和能被 99 整除

    操作规则解析

    题目允许我们将一个数字 xx 替换为 x2x^2仅当 x2<10x^2 < 10,符合条件的数字只有:

    • 0002=00^2=0,差值 00
    • 1112=11^2=1,差值 00
    • 2222=42^2=4差值 +2+2
    • 3332=93^2=9差值 +6+6

    其他数字(494\sim9)都无法进行任何操作!


    解题思路

    1. 计算原数字的各位和 sumsum,同时统计字符串中 22 的数量 cnt2cnt233 的数量 cnt3cnt3
    2. 如果 sum%9=0sum \% 9 = 0,直接输出 YES
    3. 否则,我们需要通过操作若干个 2233,让总和增加 kk,满足 (sum+k)%9=0(sum + k) \%9 =0
    4. 每个 22 能贡献 +2+2,每个 33 能贡献 +6+6,我们只需要判断:是否存在 icnt2i \le cnt2jcnt3j \le cnt3,使得 (2i+6j)%9=(9sum%9)(2i + 6j) \%9 = (9 - sum\%9)

    完整代码(带注释)

    #include <iostream>
    using namespace std;
    
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(nullptr); // 加速输入输出,应对大数据
        
        int t;
        cin >> t;
        while(t--)
        {
            string s;
            cin >> s;
            long long sum = 0; // 数字各位和
            int cnt2 = 0, cnt3 = 0; // 统计2和3的数量
            
            for(int i = 0; i < s.size(); i++)
            {
                sum += s[i] - '0';
                if(s[i] == '2') cnt2++;
                if(s[i] == '3') cnt3++;
            }
            
            // 原本就满足条件,直接输出YES
            if(sum % 9 == 0)
            {
                cout << "YES\n";
                continue;
            }
            
            // 需要补充的差值(模9意义下)
            int need = 9 - sum % 9;
            bool ok = false;
            
            // 枚举使用多少个2和3
            for(int i = 0; i <= cnt2; i++)
            {
                for(int j = 0; j <= cnt3; j++)
                {
                    // 2*i + 6*i 是总增量,模9等于需要的差值即可
                    if((2 * i + 6 * j) % 9 == need)
                    {
                        ok = true;
                        break;
                    }
                }
                if(ok) break;
            }
            
            cout << (ok ? "YES" : "NO") << '\n';
        }
        return 0;
    }
    

    代码细节讲解

    1. 输入优化 ios::sync_with_stdio(false); cin.tie(nullptr); 用于加速大数据输入输出,避免超时(题目数字长度可达 10510^5)。

    2. 统计核心数据 遍历字符串,计算数字和,同时统计可操作的 2233 的数量。

    3. 判断条件 双重循环枚举使用的 2233 的数量,检查总增量模 99 是否等于需要补充的值。

      • 每个 22 贡献 +2+2
      • 每个 33 贡献 +6+6
    4. 输出结果 找到符合条件的组合输出 YES,否则输出 NO


    时间复杂度

    • 单次测试用例:O(cnt2×cnt3)O(cnt2 \times cnt3)
    • 由于 cnt2cnt3cnt2、cnt3 最大为 99(模 99 下循环 080\sim8 即可),实际复杂度近似 O(1)O(1)
    • 整体完全满足题目 10510^5 长度的限制。

    总结

    1. 本题核心是9的整除特性 + 有限的可操作数字
    2. 只有 2233 能改变数字和,增量固定;
    3. 枚举少量组合即可判断答案,代码简洁高效。
    • 1

    信息

    ID
    7252
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者