【ABC190】A~D問題
A - Very Very Primitive Game¶
https://atcoder.jp/contests/abc190/tasks/abc190_a
考えたこと¶
- A == B の時 後攻が勝つ
- A > B の時
Takahashi
が勝つ - A < B の時
Aoki
が勝つ
AC
func main() {
A, B, C := nextInt(), nextInt(), nextInt()
fmt.Println(solve(A, B, C))
}
func solve(a, b, c int) string {
if a == b {
if c == 0 {
return "Aoki"
}
return "Takahashi"
}
if a > b {
return "Takahashi"
}
return "Aoki"
}
After Contest¶
- B = B - C で常に
Takahashi
先手と同義
B - Magic 3¶
https://atcoder.jp/contests/abc190/tasks/abc190_b
考えたこと¶
- そのまま実装
AC
func main() {
N, S, D := nextInt(), nextInt(), nextInt()
var cnt int
for i := 0; i < N; i++ {
x, y := nextInt(), nextInt()
if x < S && y > D {
cnt++
}
}
if cnt > 0 {
fmt.Println("Yes")
} else {
fmt.Println("No")
}
}
C - Bowls and Dishes¶
https://atcoder.jp/contests/abc190/tasks/abc190_c
考えたこと¶
- K \leq 16
- ボールを置く全てのパターンを全探索(O(2^K))
AC
func main() {
N, M := nextInt(), nextInt()
AB := nextInts(2 * M)
K := nextInt()
CD := nextInts(2 * K)
arr := [][]bool{make([]bool, N)}
for i := 0; i < K; i++ {
c, d := CD[i*2]-1, CD[i*2+1]-1
narr := [][]bool{}
for j := range arr {
narr = append(narr, sara(c, d, arr[j])...)
}
arr = narr
}
var ans int
for _, s := range arr {
var cnt int
for i := 0; i < M; i++ {
a, b := AB[i*2]-1, AB[i*2+1]-1
if s[a] && s[b] {
cnt++
}
}
ans = maxOf(ans, cnt)
}
fmt.Println(ans)
}
func sara(c, d int, a []bool) [][]bool {
ca := make([]bool, len(a))
copy(ca, a)
a[c] = true
ca[d] = true
return [][]bool{a, ca}
}
After Contest¶
- コンテスト中は再帰で全探索したが、bit全探索でも
func main() {
N, M := nextInt(), nextInt()
AB := nextInts(2 * M)
K := nextInt()
CD := nextInts(2 * K)
var ans int
for bit := 0; bit < 1<<K; bit++ {
dish := make([]bool, N)
for i := 0; i < K; i++ {
c, d := CD[i*2]-1, CD[i*2+1]-1
if bit>>i&1 != 0 {
dish[c] = true
} else {
dish[d] = true
}
}
var cnt int
for i := 0; i < M; i++ {
a, b := AB[i*2]-1, AB[i*2+1]-1
if dish[a] && dish[b] {
cnt++
}
}
ans = maxOf(ans, cnt)
}
fmt.Println(ans)
}
D - Staircase Sequences¶
https://atcoder.jp/contests/abc190/tasks/abc190_d
考えたこと¶
- N \leq 10^{12} より \sqrt{N} 解法を予想
- 等比数列の和
- \frac{1}{2}(2\cdot begin + length-1)\cdot length=N
- begin = \frac{N}{length}-\frac{length-1}{2}
- begin が 1以上の条件を満たす等差数列が存在する時, 対応する 1未満の要素を含む等差数列が丁度1つ存在する。
- [-begin+1, begin+length), [begin, begin+length)
- length は N の 約数であり, 自然数
- 少しガバガバだけど書いてみる
AC
func main() {
N := nextInt()
var ans int
for _, div := range divisors(N) {
a := float64(N)/float64(div) - float64(div-1)/2
if a == float64(int(a)) {
ans += 2
}
}
fmt.Println(ans)
}
func divisors(n int) []int {
ret, a := []int{}, []int{}
for i := 1; i*i <= n; i++ {
if n%i != 0 {
continue
}
ret = append(ret, i)
if i*i != n {
a = append([]int{n / i}, a...)
}
}
return append(ret, a...)
}