题意:有n对数,大小分别为1、2、3、...、n。问是否存在这个样的排列,两个1之间有1个数,两个2之间有2个数,两个3之间有3个数,。。。。。。,两个n之间有n个数,
另外数的次序可以随意。
解法:
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.解2和3中的方程可得sum(ak)=n*(3*n-1)/4, sum(bk)=n*(n+1)/4。
分析:
如果要满足题意,只需ak,bk都为整数。方程有解说明有很多排序情况,有些不符合要求,但一定有一组满足要求,我们列式的时候把这种情况也列进去了,有解,说明我们要的这种特殊情况存在。
#include<iostream> using namespace std; int main() { int N; while(cin>>N &&N) { if(N%4==0 ||((3*N-1)%4==0 && (N+1)%4==0)) puts("Y"); else puts("N"); } return 0; }
时间: 2024-11-07 04:24:26