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
12
思路: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组数的长度。可以根据这个定义来推算第三项以后的数:例如由于a(2)=2,因此第2组数的长度是2,因此a(3)=2,;
根据该定义 模拟+打表 即可
AC代码如下:
#include <iostream> #include <cstdio> using namespace std; const int maxn=1e7+10; int a[maxn]; int main() { int t; int n; a[1]=1; a[2]=2; a[3]=2; int cur=3; int flag=2; for(int i=4;i<maxn;) { int num=a[cur]; for(int j=0;j<num;j++) { if(flag==2) a[i]=1; else a[i]=2; if(j==num-1) flag=a[i]; i++; } cur++; } cin>>t; while(t--) { cin>>n; cout<<a[n]<<endl; } return 0; }