HDU 3130 17多校7 Kolakoski(思维简单)
Problem Description
This is Kolakosiki sequence: nth element.
Input
The first line contains a positive integer ).
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
题意:
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,…
它的定义很简单,若把数列中相同的数定为一组,令a(1)=1,a(2)=2,则a(n)等于第n组数的长度。
可以根据这个定义来推算第三项以后的数:例如由于a(2)=2,因此第2组数的长度是2,因此a(3)=2,;
由于a(3)=2,所以第三组数的长度是2,因此a(4)=a(5)=1;由于a(4)=1,a(5)=1,所以第四组数和第五组数的长度都为1,因此a(6)=2,a(7)=1,以此类推。
给出n求第n项的数字是多少
题解:
直接预处理根据性质算出序列
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<queue> 5 #include<algorithm> 6 #include<cmath> 7 using namespace std; 8 const int maxn=1e7+5; 9 int a[maxn]; 10 int b[maxn]; 11 12 void pre() 13 { 14 int cnta=1,cntb=1; 15 a[1]=1;b[1]=1;b[2]=2; 16 for(cnta=2,cntb=1;cnta<maxn&&cntb<maxn;cnta++) 17 { 18 a[cnta]=b[cnta]; 19 if(a[cnta]==1) 20 { 21 if(b[cntb]==1) 22 { 23 b[cntb+1]=2; 24 } 25 else 26 { 27 b[cntb+1]=1; 28 } 29 cntb++; 30 } 31 else 32 { 33 if(b[cntb]==1) 34 { 35 b[cntb+1]=2; 36 b[cntb+2]=2; 37 } 38 else 39 { 40 b[cntb+1]=1; 41 b[cntb+2]=1; 42 } 43 cntb+=2; 44 } 45 } 46 } 47 48 int main() 49 { 50 pre(); 51 int T,n; 52 scanf("%d",&T); 53 while(T--) 54 { 55 scanf("%d",&n); 56 printf("%d ",b[n]); 57 } 58 return 0; 59 }