Kolakoski
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others)Total Submission(s): 249 Accepted Submission(s): 116
题目链接:点击打开链接
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
n
th element.
Input
The first line contains a positive integer
T(1≤T≤5)
, denoting the number of test cases.
For each test case:
A single line contains a positive integer n(1≤n≤107) .
For each test case:
A single line contains a positive integer n(1≤n≤107) .
Output
For each test case:
A single line contains a nonnegative integer, denoting the answer.
A single line contains a nonnegative integer, denoting the answer.
Sample Input
2
1
2
Sample Output
1
2
2
1
2
Sample Output
1
2
题意:有这么一个序列 1,2,2,1,1,2,1,2,2,1,2,2,1,1,2,1,1,2,2,1…… ,然后给你一个n,让你输出这个序列的第n个数,一目了然就知道是 找规律,这个序列只有 1 和 2 组成,结果要么是 1 ,要么是 2 ,结果是 1 还是 2 呢,你猜猜?
分析:就是一个规律,但怎么找呢?我们一起来看看:
#include <iostream>
#include<stdio.h>
#include<cmath>
using namespace std;
#define max1 10000010
int s[max1],h[max1];
int main()
{
int T,m;
int j=3;
s[1]=1;
s[2]=2;
s[3]=2;
h[1]=1;
h[2]=2;
h[3]=2;
for(int i=4;i<=10000010;)
{
if(h[j]==2)
{
if(s[i-1]==1)
{
s[i]=2;
s[i+1]=2;
i+=2;
}
else
{
s[i]=1;
s[i+1]=1;
i+=2;
}
}
else
{
if(s[i-1]==2)
{
s[i]=1;
i++;
}
else
{
s[i]=2;
i++;
}
}
++j;
h[j]=s[j];
}
scanf("%d",&T);
while(T--)
{
scanf("%d",&m);
printf("%d\n",s[m]);
}
return 0;
}