#include
using namespace std;
const int N = 1e5 + 10;
int n, K;
struct perm {
int a[N];
perm() {
for(int i=1;i<=n;i++)
a[i] = i;
}//这一串什么时候执行
int &operator [] (int x) {
return a[x];
}//这一串和下面那一串的差别
const int &operator [] (int x) const {
return a[x];
}
friend perm operator * (perm a, perm b) {
perm c;
for(int i=1;i<=n;i++)
c[i] = b[a[i]];
return c;
}//什么是friend,等
perm inv() {
perm c;
for(int i=1;i<=n;i++)
c[a[i]] = i;
return c;
}
} ans, A, p, q, pinv, qinv, Ainv;
template T qp(T x, int t) {
T ret;
for(; t; t /=2, x = x * x) if(t & 1) ret = ret * x;
return ret;
}
int main() {
cin>>n>>K;
for(int i=1;i>p[i];
for(int i=1;i>q[i];
pinv = p.inv(), qinv = q.inv(), A = p * qinv * pinv * q, Ainv = A.inv();
if(K % 6 == 0) ans = p;
else if(K % 6 == 1) ans = q;
else if(K % 6 == 2) ans = pinv * q;
else if(K % 6 == 3) ans = qinv * pinv * q;
else if(K % 6 == 4) ans = qinv * A;
else ans = qinv * p * A;
ans = qp(Ainv, K / 6) * ans * qp(A, K / 6);
for(int i=1;i<=n;i++)
printf("%d ", ans[i]);
puts("");
return 0;
}
挂一个先,我看不懂
1.环游世界
比赛的时候第一下看其实没有一点思路,往后稍了。最后有一个四分没去拿。
2.加固
知道了它是签,使劲想正解,后面转到排序题之后忘记了下面8!的暴力。
3.图
脑子烧掉了,掏出题解之后圆方树和点双之后,脑子一下子就好了。
4.排序
排序加法讲究一个性质烂,所以要转成乘法
比赛的时候打了个暴力摸了30分低保,后面被题解的思路创到了脑子,感觉数学基础要好,然后我逆元学一下,以及上面的那串代码表达我看不懂(如注释标记)