設重啟間隔為 `t` 秒實際時間。
播放進度:`S + t`(初始 `S` + 播放 `t` 秒)。
下載進度:`S + (q-1)/q * t`。
追上條件:`S + t = S + (q-1)/q * t + S`?不,正確建模:
第 1 次播放從 0 開始,下載進度初始 `S`。
經過 `t` 秒,播放位置 `t`,下載位置 `S + (q-1)/q * t`。
當 `t = S + (q-1)/q * t` → `t/q = S` → `t = S*q`。
此時下載位置 = `S + (q-1)S = S*q`。
若 `S*q ≥ T`,歌曲已下載完,不再重啟。
否則重啟,已下載長度變為 `S*q`,繼續同理。
即每次重啟後,已下載長度乘以 `q`。
計算最小 `k` 使 `S * q^k ≥ T`,答案 = `k`(含首次播放為第 1 次)。
#include
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
long long T, S, q;
while (cin >> T >> S >> q) {
int ans = 0;
while (S < T) {
S *= q;
++ans;
}
cout << ans << "\n";
}
return 0;
}
O(log T),極快。