#include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define REP(i,n) for ( int i=1; i<=int(n); i++ ) #define MP make_pair #define PB push_back #define SZ(x) (int((x).size())) #define ALL(x) (x).begin(), (x).end() #define X first #define Y second template inline bool chkmin(T &a, const T &b) { return a > b ? a = b, 1 : 0; } template inline bool chkmax(T &a, const T &b) { return a < b ? a = b, 1 : 0; } typedef long long LL; typedef long double LD; const int INF = 0x3f3f3f3f; typedef pair pii; const int N = 1e6 + 100; int dp[N]; pii que[N]; int head, tail; int main() { int T; cin >> T; while(T --) { int n, K, m; scanf("%d%d%d", &n, &K, &m); memset(dp, 0x3f, sizeof(dp[0]) * (n + 10)); dp[1] = 0; head = tail = 0; que[tail ++] = pii(dp[1], 1); for(int i = 2; i <= n; i ++) { while(head < tail && i - que[head].Y > m) head ++; dp[i] = (head != tail) ? que[head].X + 1 : 0x3f3f3f3f; if(i % K == 0) dp[i] = min(dp[i], dp[i / K] + 1); while(head < tail && que[tail - 1].X >= dp[i]) tail --; que[tail ++] = pii(dp[i], i); } printf("%d\n", dp[n]); } }