This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <iostream>
#include <vector>
#include <algorithm>
#include <math.h>
#include <set>
#define forr(i,a,b,c) for(int i=a;i<b;i+=c)
#define fort(i,a,b) forr(i,a,b,1)
#define forn(i,n) fort(i,1,n)
#define fori(i,n) fort(i,0,n)
#define forrb(i,a,b,c) for(int i=b-1;i>=a;i-=c)
#define fortb(i,a,b) forrb(i,a,b,1)
#define fornb(i,n) fortb(i,1,n)
#define forib(i,n) fortb(i,0,n)
using namespace std;
#define into(x) cin >> x;
typedef vector<int> veci;
typedef long long lol;
typedef pair<lol,lol> point;
#define def(x) lol x; into(x)
#define logn 60
int main() {
ios::sync_with_stdio();
def(n) def(m)
veci a(n);
vector<veci> x(n, veci(n+1));
vector<veci> y(n, veci(n,-1));
vector<veci> f(logn, veci(n));
fori(i, n) {
into(a[i])
a[i]--;
}
fori(i, n) {
x[i][0]=i;
int cur = a[i];
forn(j, n+1) {
x[i][j] = cur;
if (y[i][cur] != -1) {
break;
}
y[i][cur] = j;
cur = a[cur];
}
f[0][i] = a[i];
}
forn(i, logn) {
fori(j, n) {
f[i][j] = f[i-1][f[i-1][j]];
}
}
int norm = 0;
lol mm = m;
fori(k, logn) {
if (mm % 2 == 1) {
norm = f[k][norm];
}
mm /= 2;
}
veci b(n);
fori(i, n) {
lol mm = m - y[0][i] - 1;
if (i == 0) {
mm = m-1;
}else if (y[0][i] == -1) {
b[norm] += n;
continue;
}
fori(j, n) {
if (j == i) {
b[i]++;
} else
if (y[j][i] == -1) {
int ans = j;
fori(k, logn) {
if (mm&((lol)1<<k)) {
ans = f[k][ans];
}
}
b[ans]++;
}else {
b[x[j][mm % (y[j][i]+1)]]++;
}
}
}
fori(i, n) {
cout << b[i] << endl;
}
return 0 ;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |