- A题
先看这个矩阵旋转,本质上就是数字交换位置 ->交换位置的性质 ->
逆序对是由数字交换位置得来的
-> 那我知道旋转是导致有多少个逆序对产生即可 -> 4 * 4 的矩阵旋转90度
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
转成
13 9 5 1
14 10 6 2
15 11 7 3
16 12 8 4
也就是四个环 1 4 16 13 一个环, 2 8 15 9 一个环 3 12 14 5 一个环, 1 7 10 11
一个环 每个环旋转90度就是要交换三次 所以说有12次
也就是swap()12次,那我们为什么不把他变成一个序列呢
也就是算这个序列的奇偶性那就好啦,因为1到n^2一开始一定是0个逆序对,无论选多少个44每次肯定是sawp()12次
所以说逆序对个数一定是偶数,那这样就好求了
上述情况下有2^-10的概率是错的
这个题好坏的90%正确然后样例给了一个特殊的, 样例是运行, 一定认真读题
特殊情况就是找三个数俩俩交换得出的这个概率就是其他数都放对只有3个放错
先算 4 * 4时候概率为(算不来了根据答案推导应该是2^-4次方出现)所以10 * 10时候为2^-10次方的概率出现
点击查看代码
inline void solve() {
int ind, n, m, k;
cin >> ind >> m >> k >> n;
vector<int> arr(n * n);
for (int h = 1; h <= m; h++) {
int op = 0, ans = 0;
for (int j = 0; j < k; j++) {
for (auto& x : arr) {
cin >> x;
x--;
}
debug(arr);
for (int i = 0; i < n * n; i++) {
while (arr[i] != i) {
swap(arr[i], arr[arr[i]]), op ^= 1;
debug(i);
}
}
debug(arr);
ans |= op;
}
cout << ans;
}
cout << endl;
return;
}