Kolakoski
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others)Total Submission(s): 713 Accepted Submission(s): 368
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
思路:根据题意可发现,第一个数列的第i位上的数字就是第二个数列第i组合的个数,然后就可以写出数列的内容。
以下是Kolakoski数列:$1,2,2,1,1,2,1,2,2,1,2,2,1,1,2,1,1,2,2,1……$,这个数列仅有1和2组成,并且第一项是1。同时还满足一个性质,如果把相邻且相同的项看成一组,可以得到$1,22,11,2,1,22,1,22,11,2,11,22,1……$,计算每一组项的数量,则能得到这个序列本身。这个数列是可以被唯一确定的,请求出它的第n项。1≤n≤107。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<algorithm>
using namespace std;
#define ll long long
#define ms(a,b) memset(a,b,sizeof(a))
const int M=1e7+10;
const int MM=2e3+10;
const int inf=0x3f3f3f3f;
const int mod=1e9+7;;
const double eps=1e-8;
int n,m;
int a[M];
void init()
{
a[1]=1,a[2]=2;
int k=1;
for(int i=1;i<M;i++){
if(k>M)break;
if(i%2==0){
if(a[i]==2)a[k++]=2,a[k++]=2;
else a[k++]=2;
}
else{
if(a[i]==2)a[k++]=1,a[k++]=1;
else a[k++]=1;
}
}
}
int main()
{
int t;
init();
scanf("%d",&t);
while(t--){
scanf("%d",&n);
printf("%d\n",a[n]);
}
return 0;
}