/*
Người ta xây dựng một dãy Kanto vô hạn K = k0, K1, K2, … , Kn như sau:
- Ban đầu viết dãy con gồm 1 ký tự a: K0 = a
- Ở mỗi bước i tiếp theo dãy, dãy Ki được tạo lập bằng cách thay đồng thời trong dãy Ki-1 mọi xuất hiện của a bởi dãy aba và mọi xuất hiện của b trong dãy bởi bbb.
Ví dụ:
K0 = a
K1 = aba
K2 = ababbbaba
K3 = ababbbababbbbbbbbbababbbaba
Viết chương trình xác định giá trị phần từ thứ kn trong dãy Kanto trên.
[COLOR="Red"]Lưu ý rằng đánh số phần tử thứ kn bắt đầu từ 1[/COLOR]
char Xacdinh(int n)
n = [COLOR="Red"]1 [/COLOR] thì kn = a
n = 4 thì kn = b
n = 18 thì kn =[COLOR="Red"] b[/COLOR]
*/
#include<iostream>
#include<vector>
#include<string>
using namespace std;
/**
* vector K là mảng các string K trong bài
**/
vector<string> K;
/**
* Hàm determine xác định kí tự được sinh ra bởi x và thứ tự của nó. VD : xâu "aba" được sinh ra từ 'a',
nên determine( 'a',0 ) = determine( 'a' , 2) = 'a' và determine( 'a' , 1 ) = 'b'
**/
char determine(char x, int y)
{
if(x == 'a')
{
if(y == 0 || y == 2) return 'a';
else return 'b';
}
else
{
return 'b';
}
}
/**
* Hàm run_r trả về kí tự thứ numberChar của xâu thứ numberK. Chẳng hạn kí tự thứ 2 của xâu thứ 2 là 'b'
**/
char run_r(int numberK, int numberChar)
{
if(numberK == 1 && (numberChar == 1 || numberChar == 3)) return 'a';
if(numberK == 1 && numberChar == 2) return 'b';
int r = numberChar%3;
int m = numberChar/3;
if(r == 0)return determine(run_r(numberK-1,m),r);
if(r > 0)
{
m++;
r--;
return determine(run_r(numberK-1,m),r);
}
}
char xacdinh(int n)
{
return run_r(n,n);
}
int main()
{
int n;
cout << xacdinh
(n
) << endl
; return 0;
}