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题意即为 每连续的相同数字即为一组,ai表示第i组有ai个数。例如a3为2,表明第三组有两个数,即a4=a5=1(因为第二组的数为2,要与上一组的数不同)。因为a4为1,第四组就为一个数,即a6=2.#include<iostream> using namespace std; // 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 Kolakoski数列 int a[10000000]= {0}; int main() { int t; a[1]=1; a[2]=2; a[3]=2; int m=3; //记录当前ai为第m组 for(int i=4; i<10000000; i++) { if(a[m]==1) { 如果当前为单数组,保持与ai-1不同就行 if(a[i-1]==1) a[i]=2; else a[i]=1; m++; } else { 如果当前为双数组,保持ai和ai+1与ai-1不同就行。 if(a[i-1]==1) a[i+1]=a[i]=2; else a[i+1]=a[i]=1; m++; i++; } } cin>>t; while(t--) { int n; cin>>n; cout<<a[n]<<endl; } return 0; }