結果
| 問題 | No.3253 Banned Product |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-09-19 13:57:55 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 17 ms / 2,000 ms |
| コード長 | 1,978 bytes |
| コンパイル時間 | 1,753 ms |
| コンパイル使用メモリ | 196,400 KB |
| 実行使用メモリ | 7,716 KB |
| 最終ジャッジ日時 | 2025-09-19 13:57:58 |
| 合計ジャッジ時間 | 2,897 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 9 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using int64 = long long;
// Kiểm tra x có thể viết x = a*b với 1 <= a,b <= K hay không.
// Nếu có (tức "xấu") -> trả về true; nếu không (tức "tốt") -> false.
static inline bool is_bad(long long x, long long K) {
// Duyệt ước d tới floor(sqrt(x)), xét cặp (d, x/d)
long long r = (long long) sqrtl((long double)x);
for (long long d = 1; d <= r; ++d) {
if (x % d == 0) {
long long u = d;
long long v = x / d;
if (u <= K && v <= K) return true; // tìm thấy cách viết x=a*b với a,b<=K
}
}
return false; // không có cặp (a,b)<=K nào nhân ra x -> "tốt"
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T;
if (!(cin >> T)) return 0;
while (T--) {
long long N, K;
cin >> N >> K;
// Quy tắc nhanh:
// 1) Nếu K >= N => mọi x<=N đều là a*b với a=1, b=x<=K ?
// Thực ra với x<=K thì x=1*x; còn nếu x>K thì vẫn có a=1<=K nhưng b=x>K -> không thoả cả hai <=K.
// Tuy nhiên vì cần x ≤ N, mà K >= N => mọi x in [1..N] đều <= K, nên đều "xấu". Kết luận: -1.
if (K >= N) {
cout << -1 << '\n';
continue;
}
// 2) Nếu N > K^2 => mọi x > K^2 đều không thể là a*b với a,b<=K. Vậy đáp án là N.
if (N > K * K) {
cout << N << '\n';
continue;
}
// 3) Trường hợp K < N <= K^2: duyệt x từ N xuống K+1,
// chọn x đầu tiên KHÔNG có cặp (a,b)<=K sao cho a*b=x.
long long ans = -1;
for (long long x = N; x >= K + 1; --x) {
if (!is_bad(x, K)) { // không biểu diễn được -> "tốt"
ans = x;
break;
}
}
cout << ans << '\n';
}
return 0;
}