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;
}
posted @ 2012-12-03 20:39  To be an ACMan  Views(800)  Comments(0Edit  收藏  举报