Kolakoski
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others)Total Submission(s): 623 Accepted Submission(s): 307
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
枚举就行
代码
//https://baike.baidu.com/item/Kolakoski%E5%BA%8F%E5%88%97/16683856?fr=aladdin
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;
const int maxn = 1e7+10;
int a[maxn];
int main()
{
a[1] = 1,a[2] = 2,a[3] = 2;
int cnt = 3;
for(int i = 3;i<maxn&&cnt<maxn;++i){
for(int j = 1;j<=a[i];j++){
if(a[cnt] == 2){
a[cnt+j] = 1;
}
else a[cnt+j] = 2;
}
cnt += a[i];
}
int t;
scanf("%d",&t);
while(t--){
int n;
scanf("%d",&n);
printf("%d\n",a[n]);
}
return 0;
}