題目連接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; }