package main import . "fmt" // 解説読んだけど分からん… // 入力条件の上限と問題難易度のメタ読みから全列挙で間に合う可能性を考える方向性? // 真面目な考察だと // 先頭A,MA,MMで場合分け数え上げDPでK以上になったところからの復元で間に合うみたいな感じ? // 合ってるか分からん… func main() { var n,k int Scan(&n,&k) s:=make([]byte,n) for i:= range s { s[i]='A' } dp:=make([][3][2]int,n+1) const ( A int = iota MA MM ) const ( ALL int = iota MMA ) dp[n][A][ALL]=1 dp[n][MM][ALL]=1 count:=0 p:=0 for i:=n-1;i>=0;i-- { dp[i][A][ALL]=dp[i+1][A][ALL]+dp[i+1][MA][ALL]+dp[i+1][MM][ALL] dp[i][A][MMA]=dp[i+1][A][MMA]+dp[i+1][MA][MMA]+dp[i+1][MM][MMA] count+=dp[i][A][MMA] if count >= k { p=i+1 break } dp[i][MA][ALL]=dp[i+1][A][ALL] dp[i][MA][MMA]=dp[i+1][A][MMA] count+=dp[i][MA][MMA] if count >= k { s[i-1]='M' p=i+1 break } dp[i][MM][ALL]=dp[i+1][MA][ALL]+dp[i+1][MM][ALL] dp[i][MM][MMA]=dp[i+1][MA][ALL]+dp[i+1][MM][MMA] count += dp[i][MM][MMA] if count >= k { s[i+1]='M' p=i+1 break } } for ;p