[原] 圆环-2011百度之星初赛题目

/*
@author tilltheendwjx
@blog http://blog.csdn.net/wjh200821或者http://www.cnblogs.com/tilltheendwjx/ 
*/ 
#include<iostream>
#include<vector>
using namespace std;

int gcd(int a,int b)
{
    while(1)
    {
         int tmp=a%b;
         if(tmp==0)
            return b;
         b=tmp;
         a=b;             
    }
}
int main()
{
  while(1)
  {   int n;
      int a,b;
      cin>>n;
      if(n==0)
         break;
      cin>>a>>b;
      int *list=new int[n];
      for(int i=0;i<n;++i)
      {
           cin>>list[i];
      }
      if(gcd(n,abs(a-b))==1)
         cout<<"Yes"; 
      else
         cout<<"No";
      cout<<endl;
  } 
  system("pause");
  return 0;   
} 

  

圆环

时间限制:1000ms

描述

一个圆环上有n个位置,这n个位置按顺时针依次标号为1, 2, …, n。初始时圆环的每个位置上都有一个1至n之间的整数,且每个整数只出现一次。

任何时刻,你可以将圆环上的数全部逆时针旋转一个位置,即第i个位置上的数变为原来第i + 1个位置上的数,第n个位置上的数变为原来第1个位置上的数。也可以将圆环上的数全部顺时针旋转一个位置,即第i个位置上的数变为原来第i – 1个位置上的数,第1个位置上的数变为原来第n个位置上的数。另有一个装置,可以交换圆环上第a个位置和第b个位置上的数。

下图给出了三种操作的示例,圆环上有6个位置,初始数字分别为1, 2, 4, 3, 5, 6,能交换第2个和第3个位置上的数。经过一次逆时针旋转后变为2, 4, 3, 5, 6, 1,交换后变为2, 3, 4, 5, 6, 1,再经过一次顺时针旋转后变为1, 2, 3, 4, 5, 6。

 

 

 

请问通过旋转和交换,能否使得第i个位置上的数正好是i

 

输入

输入包含多组数据。

每组数据的第一行包含一个整数n,表示圆环上的数字个数。

第二行包含两个整数ab(1 ≤ a < b ≤ n),表示可以交换圆环上第a个位置和第b个位置上的数。

接下来n行描述圆环上每个位置的初始值,其中第i行包含一个整数ai,表示初始时刻第i个位置上的数。

最后一组数据之后的一行为一个0,表示输入结束。

输出

对于每个测试用例,输出一行,如果能满足要求,这行中应只包含一个单词Yes,如果不能满足要求,这行中应只包含一个单词No。

样例输入

6

2 3

1

2

4

3

5

6

4

1 3

1

2

4

3

0

样例输出

Yes

No

提示

对于100%的数据,1 ≤ n ≤ 1,000。

posted on 2012-05-17 14:25  tilltheendwjx  阅读(609)  评论(2编辑  收藏  举报

导航