Problem:
MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], processEscapes: true }});

環状すごろく

ユキさんは、子供会の催しでみんなで遊べるようにすごろくを作りました。このすごろくでは、環状にマスが並んでいて、それぞれのマスには１以上の整数が書いてあります。

プレイヤーは出発点としてどこかのマスを選んで自分の駒を置きます。そのマスに書いてある数だけ、時計回りに駒を進めます。止まったマスに書いてある数だけ、再び時計回りに駒を進めます。これを繰り返して、出発点に選んだマスの上で駒が止まったら「あがり」です。

実際には、マスの選び方によっては絶対に「あがり」にならない場合もあります。ユキさんは、このすごろくで「あがり」にたどり着けるマスの個数を数えようとしています。

すごろくの情報を入力とし、「あがり」にたどり着けるマスの個数を報告するプログラムを作成せよ。

Input

入力は以下の形式で与えられる。

N
a1 a2 ... aN

１行目にすごろくに含まれるすべてのマスの個数 N (1 ≤ N ≤ 100000) が与えられる。２行目に、それぞれのマスに書かれた数 ai (1 ≤ ai ≤ 109) が、時計回りに順番に与えられる。

Output

「あがり」にたどり着けるマスの個数を１行に出力する。

Sample Input 1

3
1 1 1

Sample Output 1

3

Sample Input 2

3
1 1 2

Sample Output 2

2

Sample Input 3

8
2 3 7 3 3 3 4 4

Sample Output 3

6

Solution in C++11 (judge verdict: Time Limit Exceeded)

// clang-format off

#include <bits/stdc++.h>

#define int long long

#define main signed main()

// #define main int main()

#define loop(i, a, n) for (int i = (a); i < (n); i++)

#define rep(i, n) loop(i, 0, n)

#define all(v) (v).begin(), (v).end()

#define rall(v) (v).rbegin(), (v).rend()

#define prec(n) fixed << setprecision(n)

#define stlice(from, to) substr(from, (to) - (from) + 1)

#define pb push_back

#define mp make_pair

#define mt make_tuple

#define fi first

#define se second

using namespace std;

typedef pair<int, int> pii;

typedef vector<int> vi;

typedef vector<double> vd;

typedef vector<char> vc;

typedef vector<bool> vb;

typedef vector<string> vs;

typedef vector<pii> vpii;

typedef vector<vi> vvi;

typedef vector<vb> vvb;

typedef vector<vpii> vvpii;

const int INF = sizeof(int) == sizeof(long long) ? 1000000000000000000LL : 1000000000;

const int MOD = 1000000007;

const double PI = acos(-1);

template<typename A, typename B> bool cmin(A &a, const B &b) { return a > b ? (a = b, true) : false; }

template<typename A, typename B> bool cmax(A &a, const B &b) { return a < b ? (a = b, true) : false; }

bool odd(const int &n) { return n & 1; }

bool even(const int &n) { return !odd(n); }

void solve();

main { solve(); return 0; }

// clang-format on



void solve() {

  int n;

  cin >> n;

  vi a(n);

  rep(i, n) cin >> a[i];

  vi hai(n);

  rep(i, n) {

    int x = i;

    set<int> v;

    v.insert(i);

    for (;;) {

      x = (x + a[x]) % n;

      if (x == i) {

        for (int p : v) hai[p] = true;

      }

      if (v.count(x)) break;

      v.insert(x);

    }

  }

  cout << count(all(hai), true) << endl;

}