# JOI埋め
https://joi.goodbaton.com/
# 難易度7
## 最悪の記者
大小関係がたくさん与えられて、それに整合する順序があるかを求めるタイプの問題。
今回の問題では、整合する順序の存在は保証されていて、代わりに解が複数あるかどうかを求める必要がある。
$i < j$という関係性をグラフに落とし込み、$i$から$j$に有向辺が張られているとみなす。
条件より必ずDAGが出来るので、トポロジカルソートをしてあげると解の一つが求まる。
解が一つしか無いかどうかは、ノードが交換可能かどうかを調べる。
すべてのトポロジカル順に隣り合うノードの組の間に辺が張られているとき解は一つ。そうでないときは複数ある。
## Fermat
> 素数$p$と自然数$N$が与えられる
>
> $x^N + y^N \equiv z^N \mod p$
>
>を満たす整数$x, y, z$の組の個数を求めよ。
>
$0 \leq x \leq p - 1$に対する$x^N \mod p$の値は繰り返し二乗法で求まる。
### 愚直解 $\mathrm{O}(p^2)$
$x^N$の取り得る値、$y^N$の取り得る値について、それぞれ全探索し個数の積を足していくと求まる。$10^8$だけど間に合ってしまう。
*unordered_map*に繰り返し二乗法で求めた値の個数を保存していった。
### TODO: 計算量改善した解
Not solved yet
---
###### tags: `competitive-programming` `JOI`
## Route
結構難しい、グラフを拡張してダイクストラ法で解く。
3点の関係性があるので、前々回訪れたところまでの情報を持てるようにすればよい。
> $G(i, j):=$前回点$i$を訪れていて、今点$j$にいる状態
とすると、
$G(i, j) \rightarrow G(j, k)$間の状態遷移は
- $i, j$間, $j, k$間に辺が存在する
- 辺$ij$、辺$jk$のなす角が鋭角でない
の条件を満たすとき可能。
このとき、$G(i, j) \rightarrow G(j, k)$間に辺$jk$の重みを持たせた有向辺を張る。
これは$\mathrm{O}(N^3)$で実行可能。
ダイクストラで解くには単一始点にしたいので、特殊な初期状態$G(0, 0)$を考えて、$G(0, 0) \rightarrow G(0, i)$にも辺を張っていく($0,i$間に辺が存在すれば)。
以上で拡張したグラフ上でのダイクストラ法で解けた。
---
鋭角条件 : $cos\theta > 0$ の求め方は、内積を見るのが一番楽
## Flu
二点間の関係を見ていくのは厳しいけど、条件の距離の範囲が$25$と小さいのと座標が$1000\times1000$の範囲であることに注目。
各都市を予めソートしておく。また、二次元配列に都市のindexを保存しておく。
各都市について$25\times50$の範囲で探索していき、都市が存在すれば2点間に辺を張っていく。
答えは、都市$0$からの距離$dist$が$K - M + 1 \leq dist \leq K$を満たす都市の数。
距離はBFSで求めるのが自然な気がするけど、ダイクストラでも間に合う。