这道题是经典的算法对,但忽略特判,导致一直WA过不去的情况
对于一直过不去的情况,就得考虑是不是特判出了问题
这道题的特判还挺多挺复杂
我们这里依据k来进行特判
1.k = 0
(1) l >= 2 那就是None.
(2)l == 1 那就是1
(3)l == 0 这里还得分类讨论r
(1)r == 0 那就是0
(2) r >= 1 那就是1
2.k = 1
(1) l >= 2 那就是None.
(2)l == 1 那就是1
(3)l == 0 这里还得分类讨论r
(1)r == 0 这里就成了None.
(2)r >= 1 这里是1
后面的就正常做
还挺复杂,讨论点挺多,有点搞,不过学到了,一直卡着但感觉算法没问题的情况,多半是被特例卡住了
// Problem: 游戏购买!
// Contest: NowCoder
// URL: https://ac.nowcoder.com/acm/contest/45670/D
// Memory Limit: 1048576 MB
// Time Limit: 10000 ms
// Date: 2024-03-15 09:09:22
//
// Powered by CP Editor (https://cpeditor.org)
#include<bits/stdc++.h>
#define endl '\n'
#define int int64_t
using namespace std;
void solve() {
int l, r, k; cin >> l >> r >> k;
//有几个特殊情况得特判
if (k == 0) {
if (l >= 2) cout << "None.\n";
else if (l == 1) cout << 1 << endl;
else {
//l == 0
if(r) cout << "0 1\n";
else cout << "0\n";
}
return;
}
if (k == 1) {
if (l >= 2) cout << "None.\n";
else if (l == 1) cout << 1 << endl;
else {
if (r) cout << 1 << endl;
else cout << "None.\n";
}
return;
}
//k >= 2
int t = k;
set<int>st;
if (l <= 1 && 1 <= r)st.insert(1);
while (true) {
if (l <= k && k <= r)st.insert(k);
if (k > (r / t)) break;
k *= t;
//cout <<"k = " << k << endl;
}
if (st.size()) {
for (auto it : st)
cout << it << " ";
cout << endl;
}
else
cout << "None.\n";
}
signed main() {
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int t = 1;
cin >> t;
while (t--) {
solve();
}
return 0;
}