HDU 6048 - Puzzle | 2017 Multi-University Training Contest 2

/*
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 的时候就要退出。。

转载于:https://www.cnblogs.com/nicetomeetu/p/7262608.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值