B. Blackboard Fibonacci

time limit per test

1 second

memory limit per test

256 megabytes

input

standard input

output

standard output

Fibonacci numbers are the sequence of integers: f0 = 0, f1 = 1, f2 = 1, f3 = 2, f4 = 3, f5 = 5, ..., fn = fn - 2 + fn - 1. So every next number is the sum of the previous two.

Bajtek has developed a nice way to compute Fibonacci numbers on a blackboard. First, he writes a 0. Then, below it, he writes a 1. Then he performs the following two operations:

  • operation "T": replace the top number with the sum of both numbers;
  • operation "B": replace the bottom number with the sum of both numbers.

If he performs n operations, starting with "T" and then choosing operations alternately (so that the sequence of operations looks like "TBTBTBTB..."), the last number written will be equal to fn + 1.

Unfortunately, Bajtek sometimes makes mistakes and repeats an operation two or more times in a row. For example, if Bajtek wanted to compute f7, then he would want to do n = 6 operations: "TBTBTB". If he instead performs the sequence of operations "TTTBBT", then he will have made 3 mistakes, and he will incorrectly compute that the seventh Fibonacci number is 10. The number of mistakes in the sequence of operations is the number of neighbouring equal operations («TT» or «BB»).

You are given the number n of operations that Bajtek has made in an attempt to compute fn + 1 and the number r that is the result of his computations (that is last written number). Find the minimum possible number of mistakes that Bajtek must have made and any possible sequence of n operations resulting in r with that number of mistakes.

Assume that Bajtek always correctly starts with operation "T".

Input

The first line contains the integers n and r (1 ≤ n, r ≤ 106).

Output

The first line of the output should contain one number — the minimum possible number of mistakes made by Bajtek. The second line should contain n characters, starting with "T", describing one possible sequence of operations with that number of mistakes. Each character must be either "T" or "B".

If the required sequence doesn't exist, output "IMPOSSIBLE" (without quotes).

Examples

input

Copy


6 10


output

Copy


2 TBBTTB


input

Copy


4 5


output

Copy


0 TBTB


input

Copy


2 1


output

Copy


IMPOSSIBLE


 

 题意:

给你两个数,分两层,0在上,1在下,要你在经过 n 个操作之后得到这个数。操作分为两类:

            1、把上层的数加到下层去,本次得到的数是下层的新数,本次的操作符是 B

            2、把下层的数加到上层去,本次得到的数十上层的新数,本次的操作符是 T

要求你经过n次操作,使其变为r,定义正确的操作序列TBTB……,保证你给出的n次操作的错误次数最小,输出错误次数与错误序列。如果达不到r输出IMPOSIBLE

分析:

设当前执行的操作序列为‘T',则t=t+b,t>b;当前执行的操作序列为‘B',则b=t+b,b>t

我们采用逆推,如果当前的状态为(t,b),t>b,说明执行的为T得来的;b>t,说明执行的为B得来的;

即逆推的状态是唯一的,最后的状体为(1,1)

我们知道最后的情况就2*m种,(m,i) 、(i,m)   1<=i<=m

 

#include<bits/stdc++.h>
using namespace std;
#define inf 1000000000
#define N 1000005
int n,m,i,l,r,res;
char ans[N],temp[N];
void check(int t,int b)
{
int len=1,k;
while (t!=b && t>=0 && b>=0)
{
if (t>b)
{
temp[len++]='T';
t-=b;
}
else
{
temp[len++]='B';
b-=t;
}
}

if (len!=n || t!=1)
return;

temp[len]='T'; //第一个肯定为T
k=0;
for (int i=1; i<len; i++)
if (temp[i]==temp[i+1])
k++;

if (k<res)
{
res=k;
for (int i=0; i<len; i++)
ans[i]=temp[len-i];
ans[len]='\0';
}
return;
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
int i;
res=inf;
for (i=1; i<=m; i++)
{
check(i,m);
check(m,i);
}
if (res==inf)
printf("IMPOSSIBLE\n");
else
printf("%d\n%s",res,ans);
}
return 0;
}