原题链接:
HDU-6130
大意:
生成 Kolakoski 序列,查询第 n 个数。
Kolakoski 满足很有意思的性质。 a[1]=2,a[n]表示第 n 个组有多少个数字(把连续的相同数字看成一组
前几个是
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,
分组后
1,22,11,2,1,22,1,22,11,2,11,22,1,2,11,2,1,22,11
即1,2 ,2, 1,1,2, 1,2, 2, 1, 2, 2,1,1,2,...
此外还有一些性质:
没有循环节、没有通项公式、无限数列、具体 wiki 上有很多。
思路:
这是一个构造题,准确地说是一个模拟题。。涉及到我的知识盲区了,有必要补一下,比赛的时候队友马上打掉了,当时就不再想了。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define mem(s,t) memset(s,t,sizeof(s))
#define D(v) cout<<#v<<" "<<v<<endl
#define inf 0x3f3f3f3f
#define pb push_back
//#define LOCAL
inline void read(int &x){
x=0;char p=getchar();
while(!(p<='9'&&p>='0'))p=getchar();
while(p<='9'&&p>='0')x*=10,x+=p-48,p=getchar();
}
const int MAXN=2e7+10;
int a[MAXN];
a[1]=1;a[2]=2;
int v=2,j=2;
for(int i=2;i<MAXN-5;i++){
int len=a[i];
while(len){
a[j++]=v;
len--;
if(j>MAXN-5) break;
}
if(j>MAXN-5) break;
v=v%2+1;
}
int t;
read(t);
while(t--){
int n;
read(n);
printf("%d\n",a[n]);
}
}