#include using namespace std; using ll=long long; #define rep(i, n) for (int i = 0; i < (int)(n); i++) #define rrep(i, s, n) for (int i = (s); i < (int)(n); i++) const long long mod=998244353; const long long mod2=469762049; const long long mod100=1000000007; ll GCD(ll A,ll B){//GCD(A,B) while(A>=1 && B>=1){ if(A>=B) A=(A%B); else B=(B%A); } if(A!=0) return A; return B; } int N; int P[200009]; bool already[200009]; int ans[200009]; void solve(vector&cycle){ if(cycle.size()==1) return; int gcd=-1; cycle.push_back(cycle[0]); for(int i=1;i<(int)(cycle.size());i++){ int d=abs(cycle[i]-cycle[i-1]); if(gcd==-1) gcd=d; else gcd=GCD(gcd,d); } for(int i=1;i*i<=gcd;i++){ if(gcd%i==0){ int a=i,b=gcd/i; if(a==b){ ans[a]+=cycle.size()-2; } else{ ans[a]+=cycle.size()-2; ans[b]+=cycle.size()-2; } } } } int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); cin>>N; for(int i=1;i<=N;i++) cin>>P[i]; for(int i=1;i<=N;i++){ already[i]=false; ans[i]=0; } vectorcycle; for(int i=1;i<=N;i++){ if(already[i]) continue; cycle.clear(); int p=i; while(true){ if(already[p]) break; already[p]=true; cycle.push_back(p); p=P[p]; } solve(cycle); } for(int i=1;i