結果
| 問題 |
No.3299 K-th MMA String
|
| コンテスト | |
| ユーザー |
ID 21712
|
| 提出日時 | 2025-10-11 11:35:52 |
| 言語 | Go (1.23.4) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,407 bytes |
| コンパイル時間 | 11,856 ms |
| コンパイル使用メモリ | 246,656 KB |
| 実行使用メモリ | 7,720 KB |
| 最終ジャッジ日時 | 2025-10-11 11:36:07 |
| 合計ジャッジ時間 | 13,326 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | WA * 3 |
| other | WA * 20 |
ソースコード
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<n;p++ {
if count-dp[p][MM][MMA]<k {
s[p-1]='M'
s[p-2]='M'
p++
continue
}
count-=dp[p][MM][MMA]
if count-dp[p][MA][MMA]<k {
s[p-1]='M'
p++
continue
}
count-=dp[p][MA][MMA]
}
Println(string(s))
}
ID 21712