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
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题解:Kolakoski数列,打表即可。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<cstdio> 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; }