#include <bits/stdc++.h>
using namespace std;
const long long MOD = 1e9 + 7;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin >> n;
vector<int> p(n);
vector<int> pos(n); // pos[val] = where val is located
for (int i = 0; i < n; i++) {
cin >> p[i];
pos[p[i]] = i;
}
// Track min/max positions of first k values (0 to k-1)
vector<int> mn(n + 1), mx(n + 1);
int curMn = INT_MAX, curMx = -1;
mn[0] = curMn;
mx[0] = curMx;
for (int k = 1; k <= n; k++) {
int loc = pos[k - 1]; // Where is value (k-1)?
curMn = min(curMn, loc);
curMx = max(curMx, loc);
mn[k] = curMn;
mx[k] = curMx;
}
// Check if first k values are in same block
auto ok = [&](int k, int sz) -> bool {
if (k == 0) return true;
return (mn[k] / sz) == (mx[k] / sz);
};
// Find all divisors of n
vector<int> divs;
for (int d = 1; d * d <= n; d++) {
if (n % d == 0) {
divs.push_back(d);
if (d * d != n) {
divs.push_back(n / d);
}
}
}
sort(divs.begin(), divs.end());
long long ans = 0;
// For each block size
for (int sz : divs) {
// Binary search: how many consecutive values fit in one block?
int l = 0, r = n;
while (l < r) {
int m = (l + r + 1) / 2;
if (ok(m, sz)) {
l = m;
} else {
r = m - 1;
}
}
// MEX is first missing value (capped at block size)
long long mex = min((long long)sz, (long long)l);
// Add to answer
long long val = ((long long)sz % MOD) * (mex % MOD);
ans = (ans + val) % MOD;
}
cout << ans << "\n";
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpjb25zdCBsb25nIGxvbmcgTU9EID0gMWU5ICsgNzsKCmludCBtYWluKCkgewogICAgaW9zOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwogICAgY2luLnRpZShudWxscHRyKTsKICAgIAogICAgaW50IG47CiAgICBjaW4gPj4gbjsKICAgIAogICAgdmVjdG9yPGludD4gcChuKTsKICAgIHZlY3RvcjxpbnQ+IHBvcyhuKTsgIC8vIHBvc1t2YWxdID0gd2hlcmUgdmFsIGlzIGxvY2F0ZWQKICAgIAogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICBjaW4gPj4gcFtpXTsKICAgICAgICBwb3NbcFtpXV0gPSBpOwogICAgfQogICAgCiAgICAvLyBUcmFjayBtaW4vbWF4IHBvc2l0aW9ucyBvZiBmaXJzdCBrIHZhbHVlcyAoMCB0byBrLTEpCiAgICB2ZWN0b3I8aW50PiBtbihuICsgMSksIG14KG4gKyAxKTsKICAgIGludCBjdXJNbiA9IElOVF9NQVgsIGN1ck14ID0gLTE7CiAgICAKICAgIG1uWzBdID0gY3VyTW47CiAgICBteFswXSA9IGN1ck14OwogICAgCiAgICBmb3IgKGludCBrID0gMTsgayA8PSBuOyBrKyspIHsKICAgICAgICBpbnQgbG9jID0gcG9zW2sgLSAxXTsgIC8vIFdoZXJlIGlzIHZhbHVlIChrLTEpPwogICAgICAgIGN1ck1uID0gbWluKGN1ck1uLCBsb2MpOwogICAgICAgIGN1ck14ID0gbWF4KGN1ck14LCBsb2MpOwogICAgICAgIG1uW2tdID0gY3VyTW47CiAgICAgICAgbXhba10gPSBjdXJNeDsKICAgIH0KICAgIAogICAgLy8gQ2hlY2sgaWYgZmlyc3QgayB2YWx1ZXMgYXJlIGluIHNhbWUgYmxvY2sKICAgIGF1dG8gb2sgPSBbJl0oaW50IGssIGludCBzeikgLT4gYm9vbCB7CiAgICAgICAgaWYgKGsgPT0gMCkgcmV0dXJuIHRydWU7CiAgICAgICAgcmV0dXJuIChtbltrXSAvIHN6KSA9PSAobXhba10gLyBzeik7CiAgICB9OwogICAgCiAgICAvLyBGaW5kIGFsbCBkaXZpc29ycyBvZiBuCiAgICB2ZWN0b3I8aW50PiBkaXZzOwogICAgZm9yIChpbnQgZCA9IDE7IGQgKiBkIDw9IG47IGQrKykgewogICAgICAgIGlmIChuICUgZCA9PSAwKSB7CiAgICAgICAgICAgIGRpdnMucHVzaF9iYWNrKGQpOwogICAgICAgICAgICBpZiAoZCAqIGQgIT0gbikgewogICAgICAgICAgICAgICAgZGl2cy5wdXNoX2JhY2sobiAvIGQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgc29ydChkaXZzLmJlZ2luKCksIGRpdnMuZW5kKCkpOwogICAgCiAgICBsb25nIGxvbmcgYW5zID0gMDsKICAgIAogICAgLy8gRm9yIGVhY2ggYmxvY2sgc2l6ZQogICAgZm9yIChpbnQgc3ogOiBkaXZzKSB7CiAgICAgICAgLy8gQmluYXJ5IHNlYXJjaDogaG93IG1hbnkgY29uc2VjdXRpdmUgdmFsdWVzIGZpdCBpbiBvbmUgYmxvY2s/CiAgICAgICAgaW50IGwgPSAwLCByID0gbjsKICAgICAgICAKICAgICAgICB3aGlsZSAobCA8IHIpIHsKICAgICAgICAgICAgaW50IG0gPSAobCArIHIgKyAxKSAvIDI7CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAob2sobSwgc3opKSB7CiAgICAgICAgICAgICAgICBsID0gbTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHIgPSBtIC0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICAvLyBNRVggaXMgZmlyc3QgbWlzc2luZyB2YWx1ZSAoY2FwcGVkIGF0IGJsb2NrIHNpemUpCiAgICAgICAgbG9uZyBsb25nIG1leCA9IG1pbigobG9uZyBsb25nKXN6LCAobG9uZyBsb25nKWwpOwogICAgICAgIAogICAgICAgIC8vIEFkZCB0byBhbnN3ZXIKICAgICAgICBsb25nIGxvbmcgdmFsID0gKChsb25nIGxvbmcpc3ogJSBNT0QpICogKG1leCAlIE1PRCk7CiAgICAgICAgYW5zID0gKGFucyArIHZhbCkgJSBNT0Q7CiAgICB9CiAgICAKICAgIGNvdXQgPDwgYW5zIDw8ICJcbiI7CiAgICAKICAgIHJldHVybiAwOwp9