1 条题解

  • 0
    @ 2002-10-26 3:46:20

    练82.2 三连击

    解题思路

    枚举最小三位数x=100~999,通过比例算y=xB/A、z=xC/A,先保证整除且均为三位数。统计三数共9位,必须1~9各一次且不含0。

    正确性说明

    依照上述推导,逐步维护已处理部分的有效状态。每一步都完成当前项的贡献且不改变已确定的次序,结束时输出的状态恰好对应题目要求。

    易错点

    不能只比较数字和或乘积,有重复时可能误判;无解输出No!!!。

    复杂度

    固定900候选9位,时间O(1),空间O(1)。

    参考代码(C++11)

    #include <bits/stdc++.h>
    using namespace std;
    
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
        long long A, B, C;
        cin >> A >> B >> C;
        bool found = false;
        for (long long x = 100; x <= 999; x++) {
            if (x * B % A || x * C % A)
                continue;
            long long y = x * B / A, z = x * C / A;
            if (y < 100 || y > 999 || z < 100 || z > 999)
                continue;
            int cnt[10] = {};
            for (long long v : {x, y, z})
                for (; v; v /= 10)
                    cnt[v % 10]++;
            bool ok = cnt[0] == 0;
            for (int d = 1; d <= 9; d++)
                if (cnt[d] != 1)
                    ok = false;
            if (ok) {
                found = true;
                cout << x << " " << y << " " << z << "\n";
            }
        }
        if (!found)
            cout << "No!!!\n";
        return 0;
    }
    
    • 1

    信息

    ID
    509
    时间
    1000ms
    内存
    128MiB
    难度
    普及−
    标签
    递交数
    0
    已通过
    0
    上传者