杭电暑期多校集训—Kolakoski

Kolakoski

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others)

Total Submission(s): 0    Accepted Submission(s): 0


Problem Description
This is Kolakosiki sequence:  1,2,2,1,1,2,1,2,2,1,2,2,1,1,2,1,1,2,2,1. This sequence consists of  1 and  2, and its first term equals  1. Besides, if you see adjacent and equal terms as one group, you will get  1,22,11,2,1,22,1,22,11,2,11,22,1. Count number of terms in every group, you will get the sequence itself. Now, the sequence can be uniquely determined. Please tell HazelFan its  nth element.
 

Input
The first line contains a positive integer  T(1T5), denoting the number of test cases.
For each test case:
A single line contains a positive integer  n(1n107).
 

Output
For each test case:
A single line contains a nonnegative integer, denoting the answer.
 

Sample Input
 
   
2 1 2
 

Sample Output
 
   
1 2
题解:Kolakoski数列,打表即可。
Kolakoski序列是一个仅由1和2组成的无限数列,是一种通过“自描述”来定义的数列[1]  。他的前几项为
1,2,2,1,1,2,1,2,2,1,2,2,1,1,2,1,1,2,2,1,2,1,1,2,1,2,2,1,1,…(OEIS上的A000002)

它的定义很简单,若把数列中相同的数定为一组,令a(1)=1,a(2)=2,则a(n)等于第n组数的长度。

例如第一个数为奇数位,所以第一个数为1,第二个数为偶数位,a(2)=2,所以第二第三个数为2,第三个数为2在奇数位上,所以第四第五个数都为1.。。。依此类推。

#include
using namespace std;
int a[10000005];
int main()
{
    a[1]=1;a[2]=a[3]=2;
    int x=3;bool falg=true;
    for(int i=3;;i++)
    {
        if(a[i]==2)
        {
            if(falg)
            {
                a[++x]=1;a[++x]=1;falg=!falg;
            }
            else
            {
                a[++x]=2;a[++x]=2;falg=!falg;
            }
        }
        else
        {
            if(falg)
            {
                a[++x]=1;falg=!falg;
            }
            else
            {
                a[++x]=2;falg=!falg;
            }
        }
        if(x>10000004)
         break;
    }
    int T;
    scanf("%d",&T);
    while(T--){
        int b;
        scanf("%d",&b);
        printf("%d\n",a[b]);
    }
    return 0;
}






你可能感兴趣的:(2017杭电暑期集训)