Putting Candies
問題
E – Putting Candies
プログラミング初級者から上級者まで楽しめる、競技プログラミングコンテストサイト「AtCoder」。オンラインで毎週開催プログラミングコンテストを開催しています。競技…
記録
- 2022/3/9 バーチャル参加。解法わからず。
解法
- (あとで書く)
コード例
#include <bits/stdc++.h> using namespace std; #include <atcoder/all> using namespace atcoder; using ll = long long; using P = pair<int, int>; #define rep(i, n) for(int i = 0; i < (n); ++i) // using mint = modint998244353; // using mint = modint1000000007; // const int mod = 1000000007; // const ll INF = 1LL << 62; // const int INF = 1001001001; int main() { ll N, K; cin >> N >> K; vector<ll> A(N); rep(i, N) { cin >> A[i]; } ll currentTime = 0; ll currentCandy = 0; vector<ll> lastTime(N, -1); vector<ll> lastCandy(N, -1); ll u1 = 0; ll u2 = 0; ll cycleCandy = 0; while(true) { if(currentTime == K) { cout << currentCandy << endl; return 0; } if(lastTime[currentCandy % N] != -1) { u1 = lastTime[currentCandy % N]; u2 = currentTime; cycleCandy = currentCandy - lastCandy[currentCandy % N]; break; } lastTime[currentCandy % N] = currentTime; lastCandy[currentCandy % N] = currentCandy; currentTime++; currentCandy += A[currentCandy % N]; } ll maxCycles = (K - u2) / (u2 - u1); ll finalTime = u2 + maxCycles * (u2 - u1); ll finalCandy = currentCandy + maxCycles * cycleCandy; while(finalTime < K) { finalTime++; finalCandy += A[finalCandy % N]; } cout << finalCandy << endl; return 0; }