package main import . "fmt" func main() { var n int Scan(&n) xs := []int{0} for i := 0; i < 9; i++ { ys := []int{} for _, x := range xs { x *= 10 ys = append(ys, x,x+3,x+6,x+9) } xs = ys } for i := 0; i <= 9; i++ { for j := 0; j <= 9; j++ { if (i+j)%3 == 0 { xs = append(xs, i*10+j) } } } m := map[int]bool{} for _, x := range xs { if 10 <= x && x <= n { m[x] = true } } Println(len(m)) } /* 考察 3桁以上の数の場合は 任意の2桁の和が3の倍数になるには各桁が3,6,9,0になる必要がある? 和が0になる場合を3の倍数と呼ぶのかは不明だが 4種が9桁分だから4^9通り、全列挙してN以下だけピックアップするでもいいかも 2桁の場合は 3の倍数になるのはいろいろある 全通り探すでいいと思う 3の倍数なら桁和も3の倍数になるので雑に */