1. 程式人生 > >N對數的排列問題 HDU - 2554

N對數的排列問題 HDU - 2554

out 一個 main scanf .net scan else content 表示

N對數的排列問題

HDU - 2554 有N對雙胞胎,他們的年齡分別是1,2,3,……,N歲,他們手拉手排成一隊到野外去玩,要經過一根獨木橋,為了安全起見,要求年齡大的和年齡小的排在一起,好讓年齡大的保護年齡小的,然後從頭到尾,每個人報告自己的年齡,就得到了一個年齡的序列。比如有4對雙胞胎,他們報出來的年齡序列是:41312432。突然,他們中間最聰明的小明發現了一個有趣的現象,原來,這個年齡序列有一個規律,兩個1中間有1個數,兩個2中間有2個數,兩個3中間有3個數,兩個4中間有4個數。但是,如果是2對雙胞胎,那麽無論他們怎麽排年齡序列,都不能滿足這個規律。
你的任務是,對於給定的N對雙胞胎,是否有一個年齡序列,滿足這一規律,如果是,就輸出Y,如果沒有,輸出N。

Input共有若幹行,每行一個正整數N<100000,表示雙胞胎的數量;如果N=0,表示結束。Output共有若幹行,每行一個正整數,表示對應輸入行是否有一個年齡序列,滿足這一規律,如果是,就輸出Y,如果沒有,輸出NSample Input
4
2
1309
0
Sample Output
Y
N
N
這個題實際上是一個數學問題,參照網上數學大佬給出的數學算法。我編程的時候使用的是c語言。
1.首先我們將第一個出現的定為ak(k=1,2,3……),第二個定義為bk(k=1,2,3……),要滿足題目中所給出的條件,則必須滿足bk-ak=k+1。
2.其次我們最終要尋找單獨的ak或者bk的表達式,所以我們對bk-ak和bk+ak進行運算,我們首先對bk-ak進行求和sum(bk-ak)=2+3+4+…+(n+1)=n*(n+3)/2。
3.然後我們對bk+ak進行求和,每個數占一個位置從1開始到2n為止,所以sum(bk+ak)=sum(ak+bk)=1+2+3+...+2*n=(1+2*n)*(2*n)/2=(1+2*n)*n。
4.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。
5.通過2與3可得n*(n+3)/2=2*sum(ak)+n*(n+1)/2+n,sum(ak)=n*(3*n-1)/4。
最後得到的結果中無法得到ak的直接表達式,但如果ak位整數,那麽顯然sum(ak)一定為整數,最後就可以得到只要n*(3*n-1)/4為整數,就是一定存在的。

#include <stdio.h>
#include <stdlib.h>

int main()
{
int n,o,p;
while(scanf("%d",&n)!=EOF&&n!=0){
o=n*(3*n-1);
if(o%4==0){
printf("Y\n");
}
else
printf("N\n");
}
return 0;
}

N對數的排列問題 HDU - 2554