#include <bits/stdc++.h>   const int INF = 0x3f3f3f3f;   const long long int INFLL = 0x3f3f3f3f3f3f3f3fll;   long long int getint() {     long long int ret = 0;     bool f = 0;     char c;     while ((c = getchar()) <  0  || c >  9 )       if (c ==  - ) f ^= 1;     while (c >=  0  && c <=  9 ) {       ret = ret * 10 + c -  0 ;       c = getchar();     }     return f ? -ret : ret;   }   using namespace std;   const int MAXN = 200000;   int a[MAXN + 10], f[MAXN + 10][20], w[MAXN + 10], lg2[MAXN + 10];   int nxt[MAXN + 10][20], far[MAXN + 10][20];   int query(int l, int r) {     int t = lg2[r - l + 1];     int ret = f[r - (1 << t) + 1][t];     if (w[f[l][t]] > w[ret]) ret = f[l][t];     return ret;   }   int main() {     int n = getint(), N = 2 * n;     for (int i = n; i >= 1; --i) a[i + n] = a[i] = getint();     lg2[0] = -1;     for (int i = 1; i <= N; ++i) {       w[i] = i + a[i];       f[i][0] = i;       lg2[i] = lg2[i >> 1] + 1;     }     for (int j = 1; j <= lg2[N]; ++j)       for (int i = 1; i + (1 << j) - 1 <= N; ++i) {         f[i][j] = f[i + (1 << (j - 1))][j - 1];         if (w[f[i][j - 1]] > w[f[i][j]]) f[i][j] = f[i][j - 1];       }     for (int i = 1; i < N; ++i) {       nxt[i][0] = query(i + 1, min(N, i + a[i]));       far[i][0] = w[i];     }     far[N][0] = nxt[N][0] = N;     for (int j = 1; j <= lg2[N]; ++j)       for (int i = 1; i <= N; ++i) {         nxt[i][j] = nxt[nxt[i][j - 1]][j - 1];         far[i][j] = far[nxt[i][j - 1]][j - 1];       }     long long int output = 0;     for (int i = 1; i <= n; ++i) {       int ans = 0, u = i;       for (int j = lg2[N]; j >= 0; --j)         if (far[u][j] < i + n - 1) ans += 1 << j, u = nxt[u][j];       output += ans + 1;     }     printf( %I64d n , output);     return 0;   }   