您的位置:首页 > 其它

HDU 6130 Kolakoski【】

2017-08-16 15:17 357 查看


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 nth
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).

 

Output

For each test case:

A single line contains a nonnegative integer, denoting the answer.

 

Sample Input

2
1
2

 

Sample Output

1
2

 

Source

2017 Multi-University Training Contest - Team 7

 

思路:根据题意可发现,第一个数列的第i位上的数字就是第二个数列第i组合的个数,然后就可以写出数列的内容。

以下是Kolakoski数列:$1,2,2,1,1,2,1,2,2,1,2,2,1,1,2,1,1,2,2,1……$,这个数列仅有11和22组成,并且第一项是11。同时还满足一个性质,如果把相邻且相同的项看成一组,可以得到$1,22,11,2,1,22,1,22,11,2,11,22,1……$,计算每一组项的数量,则能得到这个序列本身。这个数列是可以被唯一确定的,请求出它的第nn项。1\leq
n\leq10^71≤n≤10​7​​。

#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
);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: