多校7 HDU-6130 Kolakoski 构造数列 & 模拟

来源:互联网 发布:帝国cms怎么建站 编辑:程序博客网 时间:2024/05/29 17:59

原题链接:
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 LOCALinline 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]);    }}
原创粉丝点击