AtCoder Beginner Contest 220 C - Long Sequence
問題の要約
長さNの正整数のみからなる数列A=(A1,...,AN)がある。
Aを10^100回連結した数列を数列Bとする。
Bの項を前から順に足したとき,和が初めてXを超えるのは何項目まで足したときか?
すなわち,以下の式を満たす最小の整数kを求めよ。
Σ{i=1,k}Bi > X
制約
1<=N<=10^5
1<=Ai<=10^9
1<=X<=10^18
入力
N
A1 ... AN
X
考え方
1,数列の番号を1ずらす
A=(A1,...,AN) => A=(A0,,,AN-1)
2,Aの数列を全て足したものをA_sumとするとき,X/A_sumで何回割れるかわかる。
3,X/A_sumにNをかければ何項目まで足したかわかる。
4,後はX%A_sumだけ考えればよい。しかもそれは連結していないAの数列だけを考えればよい。
実際のプログラム
#include<iostream>
#include<vector>
using namespace std;
int main(){
long long N;
cin >> N;
vector<long long> A(N);
for(long long i = 0; i < N; i++){
cin >> A[i];
}
long long X;
cin >> X;
long long A_sum = 0;
for(long long i = 0; i < N; i++){
A_sum += A[i];
}
long long count = (X / A_sum) * N;
X = X % A_sum;
long long sum = 0;
for(long long i = 0; i < N; i++){
if(X < sum){
break;
}else{
sum += A[i];
count++;
}
}
cout << count << endl;
return 0;
}