1 条题解
-
0
练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