yokobuttonの不定期で競技プログラミングをするブログ

不定期で解けた競技プログラミングコンテストの問題を載せています。

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;
}