HDU 2554 n对数的排列 数论 总结规律题
题意:n对数,大小为1、2、3、...、n。现要求两个1之间有1个数,两个2之间有2个数,以此类推,两个n之间有n个数, 并且,数的次序可以随意的。
解法:
我们用sum()表示求和运算。
1.设k(k=1,2,..,n)放置的第一个位置为ak,第二个位置为bk。显然有bk-ak=k+1(ak<bk)
那么会有sum(bk-ak)=2+3+4+...+(n+1)=(1+2+3+...+n)+(1+1+...+1)=n*(n+3)/2。
2.又因为要有2*n个位置来放置这2*n个数。则sum(ak+bk)=1+2+3+...+2*n=(1+2*n)*(2*n)/2=(1+2*n)*n。
3.sum(ak+bk)=sum(ak+ak+k+1)=sum(2*ak+bk-ak)=2*sum(ak)+sum(bk-ak)=2*sum(ak)+n*(n+1)/2+n。
4.解方程②③可得 sum(ak)=n*(3*n-1)/, sum(bk)=n*(n+1)/4。
分析:
情况只有两种:
1.ak,bk都不为整数。 2.ak,bk都为整数。
情况1必定无解。
让我们疑惑的是, 情况2, 方程有解就一定存在一个我们要的排序吗? 答案是一定。
我们可以这么想,方程有解说明有很多排序情况,有些不符合题目要求,但一定有一组是满足题目要求的,因为我们列式的时候把这种情况也列进去了,方程有解,说明我们要的这种特殊情况存在。
View Code
#include<cstdio> #include<cstring> int main() { int n; while( ~scanf("%d", &n) && n) if(n%4 == 0 || (n+1) % 4 == 0) puts("Y"); else puts("N"); return 0; }