Official

C - Long Sequence Editorial by sugarrr


求める答えを \(K\) と書きます。
\(sumA= \sum_{i=1}^{N} A_i\) と書きます。

\(\{B_1 , \dots , B_K\}\) は、\(A\) 全体をいくつか ( \(p\) 個とします ) 連結したあと、\(A\) の先頭のいくつかの項 ( \(q\) 項とします ) を連結した形をしています。
ただし、\(p \geq 0, 1 \leq q \leq N\) とします。

\(p,q\) を求めましょう。

\(p\) は、\( p={ \lfloor \frac{X}{sumA} \rfloor}\) で求まります。
\(q\) は、愚直に \(A_i\) を足していくことで計算量 \(O(N)\) で求まります。

\(K=p \times N+q\) として答えが求まるので、 以上よりこの問題を解くことができました。

C++ の実装例を示します。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

signed main(){
    ll n;cin>>n;
    vector<ll> a(n);
    for(int i=0;i<=n-1;i++)cin>>a[i];
    ll x;cin>>x;

    ll sum=0;
    for(ll val:a)sum+=val;
    ll P = x / sum;
    ll sumb = P * sum;
    ll ans = P * n;

    for(ll val:a){
        sumb += val;
        ans++;
        if(sumb > x){
            cout<< ans <<endl;
            return 0;
        }
    }
    return 0;
}

posted:
last update: