HDU 6048 Puzzle(逆序数+等差数列)
来源:互联网 发布:算法工程师 待遇 编辑:程序博客网 时间:2024/06/05 03:39
传送门
题意:
给你一个N*M大小的矩阵,表示一个“拼图”模型,这个拼图有N*M-1个块,现在有1~N*M-1个编号,给你一个P,每次取第1个,第1+P个,第1+2*P个,第1+3*P个……依次从上到下,从左到右填入到模型中,问是否可以通过有限次的移动使得编号按照1~N*M-1的顺序排列好,输出YES和NO。
思路:
原排列的写出来之后写成一排,这个序列的逆序数为偶数即“YES”,否则“NO”。
下面来求逆序数。
对于一个序列1,2,3,4.......n
给出一个p,一轮能取得的数是1,p+1,2*p+1....
一共取出的数的个数temp=(n-1)/p+1
比第一个数小且没取过的数(逆序数)是0,
比第二个数小且没取过的数(逆序数)是p-1
比第三个数小且没取过的数(逆序数)是2*(p-1)
上面的序列构成了一个等差数列,其和为(0+(temp-1)*(p-1))*temp/2
手动写出几项,发现对于每一次构造都满足上面的公式
循环求和即可求出
代码:
#include <bits/stdc++.h>using namespace std;typedef long long LL;int main(){ int t; LL n,m,p,temp,sum,ans; scanf("%d",&t); while(t--) { scanf("%lld%lld%lld",&n,&m,&p); sum=n*m-1; ans=0; while(sum>p) { temp=(sum-1)/p+1;///每轮的个数 sum-=temp; ans+=(temp-1)*(p-1)*temp/2;///每轮构成的几个数构成等差数列,求和 } if(ans&1) printf("NO\n"); else printf("YES\n"); } return 0;}
阅读全文
0 0
- HDU 6048 Puzzle(逆序数+等差数列)
- hdu 6048 Puzzle(规律+逆序对)
- hdu 6048puzzle (逆序对)
- 【HDU 6048 Puzzle】 逆序对 & 思维
- 2017多校第二场 HDU 6048 Puzzle 逆序数,脑洞题,结论题
- hdu 4021 24 Puzzle ( 逆序数判断是否可解 )
- Puzzle(HDU 6048)
- HDU 6048 Puzzle 逆序对 计数 发现基本操作
- HDU 6048 Puzzle(机智)
- hdu 6048 逆序数+思维数学
- HDU 4911 Iversion(求逆序数)
- hdu 4911 Inversion(求逆序数)
- hdu 1394(求逆序数)
- HDU 5775 (Bubble Sort 逆序数)
- hdu-1394-逆序数
- hdu 1394 逆序数
- hdu 1394 逆序数
- HDU 1394(逆序数)
- MyBatis学习笔记:基于xml和注解对表的基本操作
- Python 2与Python 3的区别
- 常见三维重建算法及其实现(含源码下载链接)
- js内置对象 学习笔记
- tensorflow笔记:常用函数
- HDU 6048 Puzzle(逆序数+等差数列)
- QT笔记
- ARM指令中如何判断一个立即数是 有效立即数
- opencv Mat 图像数据元素进行排序
- ZooKeeper_7_Java操作ZK_获取数据
- [mysql]explain语句中的key_len计算
- 【CS 2645】Spore (spfa松弛判负环)
- hdu1232 畅通工程(并查集模板)
- Java学习资料