#include using namespace std; using ll=long long; using ull=unsigned long long; using P=pair; templateusing minque=priority_queue,greater>; templatebool chmax(T &a,const T &b){return (abool chmin(T &a,const T &b){return (a>b?(a=b,true):false);} templateistream &operator>>(istream &is,pair&p){is>>p.first>>p.second;return is;} templateistream &operator>>(istream &is,tuple&a){is>>std::get<0>(a)>>std::get<1>(a)>>std::get<2>(a);return is;} templateistream &operator>>(istream &is,array&a){for(auto&i:a)is>>i;return is;} templateistream &operator>>(istream &is,vector &a){for(auto &i:a)is>>i;return is;} templatevoid operator++(pair&a,int n){a.first++,a.second++;} templatevoid operator--(pair&a,int n){a.first--,a.second--;} templatevoid operator++(vector&a,int n){for(auto &i:a)i++;} templatevoid operator--(vector&a,int n){for(auto &i:a)i--;} #define overload3(_1,_2,_3,name,...) name #define rep1(i,n) for(int i=0;i<(int)(n);i++) #define rep2(i,l,r) for(int i=(int)(l);i<(int)(r);i++) #define rep(...) overload3(__VA_ARGS__,rep2,rep1)(__VA_ARGS__) #define reps(i,l,r) rep2(i,l,r) #define all(x) x.begin(),x.end() #define pcnt(x) __builtin_popcountll(x) #define fin(x) return cout<<(x)<<'\n',static_cast(0) #define yn(x) cout<<((x)?"Yes\n":"No\n") #define uniq(x) sort(all(x)),x.erase(unique(all(x)),x.end()) template inline int fkey(vector&z,T key){return lower_bound(z.begin(),z.end(),key)-z.begin();} ll myceil(ll a,ll b){return (a+b-1)/b;} template auto vec(const int (&d)[n],const T &init=T()){ if constexpr (id(d,init)); else return init; } #ifdef LOCAL #include #define SWITCH(a,b) (a) #else #define debug(...) static_cast(0) #define debugg(...) static_cast(0) #define SWITCH(a,b) (b) templateostream &operator<<(ostream &os,const pair&p){os<>testcase; for(int i=0;ipar; int cs; public: UnionFind(int n):par(n,-1),cs(n){} UnionFind(){} int root(int u){ if(par[u]<0)return u; return par[u]=root(par[u]); } bool merge(int u,int v){ int ru=root(u),rv=root(v); if(ru==rv)return false; if(par[ru]>get_all(){ std::vector>res(par.size()); for(int i=0;i<(int)par.size();i++)res[root(i)].push_back(i); int p=0; for(int i=0;i<(int)res.size();i++){ if(!res[i].empty()){ if(i==p)p++; else res[p++]=std::move(res[i]); } } res.resize(p); return res; } }; std::vectorprime_sieve(int n){ if(n<=6){ if(n<=1)return std::vector{}; else if(n==2)return std::vector{2}; else if(n<=4)return std::vector{2,3}; else return std::vector{2,3,5}; } static constexpr int mod30table[8]={1,7,11,13,17,19,23,29}; static constexpr uint8_t k_mask[][8] = { {0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f}, {0xfd, 0xdf, 0xef, 0xfe, 0x7f, 0xf7, 0xfb, 0xbf}, {0xfb, 0xef, 0xfe, 0xbf, 0xfd, 0x7f, 0xf7, 0xdf}, {0xf7, 0xfe, 0xbf, 0xdf, 0xfb, 0xfd, 0x7f, 0xef}, {0xef, 0x7f, 0xfd, 0xfb, 0xdf, 0xbf, 0xfe, 0xf7}, {0xdf, 0xf7, 0x7f, 0xfd, 0xbf, 0xfe, 0xef, 0xfb}, {0xbf, 0xfb, 0xf7, 0x7f, 0xfe, 0xef, 0xdf, 0xfd}, {0x7f, 0xbf, 0xdf, 0xef, 0xf7, 0xfb, 0xfd, 0xfe}, }; static constexpr int c0[][8] = { {0, 0, 0, 0, 0, 0, 0, 1}, {1, 1, 1, 0, 1, 1, 1, 1}, {2, 2, 0, 2, 0, 2, 2, 1}, {3, 1, 1, 2, 1, 1, 3, 1}, {3, 3, 1, 2, 1, 3, 3, 1}, {4, 2, 2, 2, 2, 2, 4, 1}, {5, 3, 1, 4, 1, 3, 5, 1}, {6, 4, 2, 4, 2, 4, 6, 1}, }; static constexpr int c1[8]={6,4,2,4,2,4,6,2}; n++; int sz=(n+29)/30; std::vectorp(sz,0xff); { int r=n%30; if(r==0); else if(r==1)p.back()=0x00; else if(r<=7)p.back()=0x01; else if(r<=11)p.back()=0x03; else if(r<=13)p.back()=0x07; else if(r<=17)p.back()=0x0f; else if(r<=19)p.back()=0x1f; else if(r<=23)p.back()=0x3f; else if(r<=29)p.back()=0x7f; } p[0]=0xfe; int sq=std::min(sz-1,((int)std::sqrt(n)+29)/30); for(int i=0;i<=sq;i++){ for(uint8_t f=p[i];f>0;f=f&(f-1)){ uint8_t l=__builtin_ctz(f); int m=mod30table[l]; int pm=i*30+m*2; for(int j=i*pm+m*m/30,k=l;j<(int)p.size();j+=i*c1[k]+c0[l][k],k=(k+1)&7){ p[j]&=k_mask[l][k]; } } } std::vectorres{2,3,5}; for(int i=0;i<(int)p.size()-1;i++){ for(int j=p[i];j>0;j=j&(j-1))res.push_back(i*30+mod30table[__builtin_ctz(j)]); } for(int j=p.back();j>0;j=j&(j-1)){ int l=__builtin_ctz(j); int k=(p.size()-1)*30+mod30table[l]; if(k void divisor_zeta(std::vector&a){ int n=a.size()-1; std::vectorp=prime_sieve(n); for(int i:p)for(int j=1;j<=n/i;j++)a[i*j]+=a[j]; } template void divisor_mobius(std::vector&a){ int n=a.size()-1; std::vectorp=prime_sieve(n); for(int i:p)for(int j=n/i;j>=1;j--)a[i*j]-=a[j]; } template void multiplier_zeta(std::vector&a){ int n=a.size()-1; std::vectorp=prime_sieve(n); for(int i:p)for(int j=n/i;j>=1;j--)a[j]+=a[i*j]; } template void multiplier_mobius(std::vector&a){ int n=a.size()-1; std::vectorp=prime_sieve(n); for(int i:p)for(int j=1;j<=n/i;j++)a[j]-=a[i*j]; } void SOLVE(){ int n; cin>>n; vectora(n); cin>>a; a--; UnionFind uf(n); rep(i,n)uf.merge(i,a[i]); vectorans(n+1); for(auto g:uf.get_all()){ int x=0; rep(i,g.size()-1)x=gcd(x,abs(g[i]-g[i+1])); ans[x]+=g.size()-1; } multiplier_zeta(ans); rep(i,1,n)cout<