/* HDU 6048 - Puzzle [ 思维,结论 ] | 2017 Multi-University Training Contest 2 题意: 类似华容道的问题, N*M 的矩阵中N*M-1个元素按一定要求打乱,每次可以把一个和空格有公共边的块和空格交换 问能否还原局面:从上到下从左到右,依次填 1,2,3,… 右下角为空。 分析: 结论1:将原矩阵看作从左到右从上到下的数列,任意操作不改变 逆序对数量的奇偶性 结论2:任意局面一定能还原到 除了最右下角2*2方格中的3个数字,剩下的数字全都移到要求位置 结论3:最右下角2*2方格的局面中只有序对数量的奇偶性相同的可互达 最终结论:数列逆序对为偶数则YES,反之为NO 由于每次隔P个拿,故当某轮桌上只有num个数字时,第x+1次取第 xp+1 个,它前面有xp个数字,被拿掉了x个 故对于这一轮的第x+1个数字对逆序对的贡献为 x*(p-1),可以看出是等差数列 */ #include <bits/stdc++.h> using namespace std; int t, n, m, p; int main() { scanf("%d", &t); while (t--) { scanf("%d%d%d", &n, &m, &p); int ans = 0, num = n*m-1; while (num > p) { int x = (num-1)/p; ans += x*(p-1) * (x+1) / 2; num -= x+1; } if (ans&1) puts("NO"); else puts("YES"); } }
题解证明很详细
*更新了代码,原代码TLE- -,num <= p 的时候就要退出。。