Kolakoski
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others)Total Submission(s): 955 Accepted Submission(s): 562
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
Source
Recommend
找规律,看第二个数列,用逗号隔开的,是1212这种轮回,然后,慢慢的就墨迹出来规律了
My ugly code
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <iostream>
#include <algorithm>
#define ll long long
using namespace std;
const int maxn=1e7+10;
int t,n;
int a[maxn]={0,1,2,2,1};
void INIT(){
int k=3;
for(int i=3;i<=1e7 && k<=1e7;i++){
if(a[i] == 2){
if(a[k]==2){
a[k+1]=1;
a[k+2]=1;
}
else{
a[k+1]=2;
a[k+2]=2;
}
k=k+2;
}
else{
if(a[k]==1){
a[k+1]=2;
}
else{
a[k+1]=1;
}
k=k+1;
}
}
}
int main(){
INIT();
scanf("%d",&t);
while(t--){
scanf("%d",&n);
printf("%d\n",a[n]);
}
return 0;
}