AtCoder ABC 327 の A,B,C だけやってみた (Java)

# 詳細
[AtCoder ABC327](https://atcoder.jp/contests/abc327)
# A
## 問題
与えられた文字列の中に `ab` もしくは `ba` が含まれているか。
## コード
```java
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        scanner.next();
        String S = scanner.next();
        scanner.close();
        System.out.println(S.contains("ab") || S.contains("ba") ? "Yes" : "No");

    }
}
```


# B
## 問題
与えられた整数を B として、
```math
X^X = B
```
となるような X を出力する。
また、B の範囲は
```math
1 \leq B \leq 10^{18}
```
である。

## コード
```java
import java.math.BigDecimal;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        long B = Long.parseLong(scanner.next());
        BigDecimal b = new BigDecimal(B);
        scanner.close();
        for (int i=1;i<16;i++) {
            BigDecimal x = new BigDecimal(i);
            if (x.pow(i).equals(b)) {
                System.out.println(i);
                return;
            }
        }
        System.out.println("-1");
    }
}

```

ループの範囲は
```math
15^{15} = 4.379 * 10^{17}
```
```math
16^{16} = 1.845 * 10^{19}
```
から設定するとして、気を付けなくてはいけないのは累乗の計算をする部分である。
`Math.pow` を使用すると内部での誤差が無視できない大きさになるので今回は使わない。
代わりに `BigDecimal` 型を使用する。

[JavaDoc BigDecimal](https://docs.oracle.com/javase/jp/8/docs/api/java/math/BigDecimal.html)

```java
import java.math.*;

class HelloWorld {
    public static void main(String[] args) {
        // 普通の Math.pow
        System.out.println(Math.pow(15,15));

        // BigDecimal の pow
        BigDecimal a = new BigDecimal(15);
        System.out.println(a.pow(15));
    }
}

/*
4.3789389038085939E17
437893890380859375
*/
```

また、 `BigDecimal` では数値の比較を `equals` メソッドで行う。`==` 演算子は使わない。

# C
## 問題
与えられた数独が正しいかを判定する。

[数独 (Wikipedia)](https://ja.wikipedia.org/wiki/%E6%95%B0%E7%8B%AC)

# コード
```java
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int[][] A = new int[9][9];
        int flag = 0;
        for (int i=0;i<9;i++) {
            Set<Integer> set = new HashSet<>();
            for (int j=0;j<9;j++) {
                int a = Integer.parseInt(scanner.next());
                A[j][i] = a;
                set.add(a);
            }
            if (set.size() != 9) flag = 1;
        }
        scanner.close();
        if (flag == 1) {
            System.out.println("No");
            return;
        }

        Set<Integer> set = new HashSet<>();
        for (int x=0;x<9;x++) {
            set.clear();
            for (int y=0;y<9;y++) {
                set.add(A[x][y]);
            }
            if (set.size() != 9) {
                System.out.println("No");
                return;
            }
        }

        for (int i=0;i<9;i+=3) {
            for (int j=0;j<9;j+=3) {
                set.clear();
                for (int ii=0;ii<3;ii++) {
                    for (int jj=0;jj<3;jj++) {
                        set.add(A[i+ii][j+jj]);
                    }
                }
                if (set.size() != 9) {
                    System.out.println("No");
                    return;
                }
            }
        }

        System.out.println("Yes");
        
    }
}
```