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: