package main import . "fmt" func main() { var n,k int Scan(&n,&k) dp := make([]int, n+1) for i := range dp { dp[i] = 1e9 } dp[1] = 0 for i := 1; i < n; i++ { if i*2 < len(dp) { dp[i*2] = min(dp[i*2], dp[i]+1) } if i+3 < len(dp) { dp[i+3] = min(dp[i+3], dp[i]+1) } } if dp[n] <= k { Println("YES") } else { Println("NO") } } /* 考察 K回ちょうど、とかだったら N = 2^y + 3 * ( x[1] * 2^y + x[2] + 2^(y-1) + ... + x[y]*2^1 + x[y+1]*2^0 ) から (N - 2^y) / 3 = x[1] * 2^y + x[2] + 2^(y-1) + ... + x[y]*2^1 + x[y+1]*2^0 N >= 2^y (N - 2^y) ≡ 0 (mod 3) K = y + x[1] + x[2] + ... + x[y] + x[y+1] で (N - 2^y) / 3 >= K - y で x[y+1] = K - y を割り当てたあと不足分をx[1]のほうから貪欲に埋めていくとかで、できそうな? 質問のとこで0回以上K回以下と書いてあるから 普通に1から操作繰り返す動的計画法で求めるぽそう */