hud 2554 N對數的排列問題 (規律)

題目連接php

Problem Description
有N對雙胞胎,他們的年齡分別是1,2,3,……,N歲,他們手拉手排成一隊到野外去玩,要通過一根獨木橋,爲了安全起見,要求年齡大的和年齡小的排在一塊兒,好讓年齡大的保護年齡小的,而後從頭至尾,每一個人報告本身的年齡,就獲得了一個年齡的序列。好比有4對雙胞胎,他們報出來的年齡序列是:41312432。忽然,他們中間最聰明的小明發現了一個有趣的現象,原來,這個年齡序列有一個規律,兩個1中間有1個數,兩個2中間有2個數,兩個3中間有3個數,兩個4中間有4個數。可是,若是是2對雙胞胎,那麼不管他們怎麼排年齡序列,都不能知足這個規律。
你的任務是,對於給定的N對雙胞胎,是否有一個年齡序列,知足這一規律,若是是,就輸出Y,若是沒有,輸出N。ios

Input
共有若干行,每行一個正整數N<100000,表示雙胞胎的數量;若是N=0,表示結束。c++

Output
共有若干行,每行一個正整數,表示對應輸入行是否有一個年齡序列,知足這一規律,若是是,就輸出Y,若是沒有,輸出N安全

Sample Input
4
2
1309
0spa

Sample Output
Y
N
Ncode

分析:ip

n對數,共2n個數。因此要有2n個位置來放置這2*n個數。②sum()表示求和運算。get

正式解決:io

①設k(k=1,2,..,n)放置的第一個位置爲ak,第二個位置爲bk。顯然有bk-ak=k+1(假定下一個位置在上一個位置以前)。class

那麼會有sum(bk-ak)=2+3+4+...+(n+1)=(1+2+3+...+n)+(1+1+...+1)=n*(n+1)/2+n。

②又由於要有2n個位置來放置這2n個數。則sum(ak+bk)=1+2+3+...+2n=(1+2n)(2n)/2=(1+2n)n。

③sum(ak+bk)=sum(ak+ak+k+1)=sum(2ak+bk-ak)=2sum(ak)+sum(bk-ak)=2sum(ak)+n(n+1)/2+n。

④比較②③可得:(1+2n)n=2sum(ak)+n(n+1)/2+n。可得sum(ak)=n(3n-1)/4。

⑤就像前面已經說過的同樣,ak表示數k第一次出現的位置。ak不易肯定。當能夠確定的是sum(ak)必定爲正整數。

那麼就會有n=4p或者3n-1=4*p(p爲正整數)。

代碼:

#include<stdio.h>
#include<iostream>
using namespace std;
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF && n!=0)
    {
        if(n%4==0 || (3*n-1)%4==0)
            printf("Y\n");
        else
            printf("N\n");
    }
    return 0;
}
相關文章
相關標籤/搜索