package main import . "fmt" import . "math/big" func main() { var n,k int Scan(&n,&k) s := make([]byte, n) for i := range s { s[i] = 'A' } Zero := NewInt(0) One := NewInt(1) dp := make([][3][2]*Int, n+1) const ( A int = iota MA MM ) const ( ALL int = iota MMA ) for i := 0; i < 3; i++ { for j := 0; j < 2; j++ { dp[n][i][j] = Zero } } dp[n][A][ALL] = One dp[n][MM][ALL] = One p, c := 0, 0 all := false next := A for i := n-1; i >= 0; i-- { dp[i][A][ALL] = new(Int).Add(dp[i+1][A][ALL], new(Int).Add(dp[i+1][MA][ALL], dp[i+1][MM][ALL])) dp[i][A][MMA] = new(Int).Add(dp[i+1][A][MMA], new(Int).Add(dp[i+1][MA][MMA], dp[i+1][MM][MMA])) count := dp[i][A][MMA].Int64() if int(count) >= k { println("A") println(i) println(count) d := dp[i+1][MM][MMA].Int64() if int(count-d) < k { p, c = i+1, int(count) next = MM break } count -= d d = dp[i+1][MA][MMA].Int64() if int(count-d) < k { p, c = i+1, int(count-d) next = MA break } p, c = i+1, int(count-d) next = A break } dp[i][MA][ALL] = dp[i+1][A][ALL] dp[i][MA][MMA] = dp[i+1][A][MMA] count += dp[i][MA][MMA].Int64() if int(count) >= k { println("MA") println(i) println(count) s[i-1] = 'M' p, c = i+1, int(count) next = A break } dp[i][MM][ALL] = new(Int).Add(dp[i+1][MA][ALL], dp[i+1][MM][ALL]) dp[i][MM][MMA] = new(Int).Add(dp[i+1][MA][ALL], dp[i+1][MM][MMA]) count += dp[i][MM][MMA].Int64() if int(count) >= k { println("MM") println(i) println(count) s[i-1] = 'M' if d := dp[i+1][MM][MMA].Int64(); int(count-d) < k { p, c = i+1, int(count) next = MM } else { p, c = i+1, int(count-d) next = MA all = true println(i) } break } } for ; p < n; p++ { if all { switch next { case A: d := dp[p+1][MM][ALL].Int64() if c-int(d) < k { next = MM } else { c -= int(d) d = dp[p+1][MA][ALL].Int64() if c-int(d) < k { next = MA } else { c -= int(d) next = A } } case MA: s[p-1] = 'M' next = A case MM: s[p-1] = 'M' d := dp[p+1][MM][ALL].Int64() if c-int(d) < k { next = MM } else { c -= int(d) next = MA } } } else { switch next { case A: d := dp[p+1][MM][MMA].Int64() if c-int(d) < k { next = MM } else { c -= int(d) d = dp[p+1][MA][MMA].Int64() if c-int(d) < k { next = MA } else { c -= int(d) next = A } } case MA: s[p-1] = 'M' next = A case MM: s[p-1] = 'M' d := dp[p+1][MM][MMA].Int64() if c-int(d) < k { next = MM } else { c -= int(d) next = MA all = true } } } } Println(string(s)) }