AtCoder Regular Contest 172 D,E問題メモ
D - Distance Ranking
問題
- N 次元空間上に、N 個の点を配置する
- 点対は N(N−1)2 個あるが、これらが特定の順で与えられる
- 各点対のユークリッド距離が、与えられた順に狭義単調増加となるように、N 個の点の配置の一例を決定せよ
- ただし各次元の座標は 0 以上 108 以下の整数でなければならない
- 2≤N≤20
解法
点 Pi の座標を (xi1,xi2,...,xiN) として、d(Pi,Pj)=(xi1−xj1)2+(xi2−xj2)2+... とする。
d はユークリッド距離の2乗だが、ルートしても大小関係は変わらないので、距離の比較はこれでおこなってもよい。
一番近いのをとりあえず距離1とかにして考え始めたくなるが、、、
「(1,2) は1番近く、(2,3) は2番目に近いが、(1,3) は200番目」みたいな入力もあり得る。
あまり近づけすぎると、(1,3) の間に、他の197個の距離を収められなくなってしまう。
そもそも、N 個の点に対して N 次元あるというのが結構潤沢である。
n 次元超立方体のような形でも 2n 個の点が収められるので、次元が余る。
では、i 番目の点は i 次元目だけ正で、他は0なところから微調整するとどうだろうか?
P1 (100 0 0 0) P2 ( 0 100 0 0) P3 ( 0 0 100 0) P4 ( 0 0 0 100)
この時点では、どの点も同じ距離である。
ここで、P1 と P2 を近づけたければ、x12 だけ、ちょっと増やしてやればよさそう。
P1 (100 1 0 0) P2 ( 0 100 0 0) P3 ( 0 0 100 0) P4 ( 0 0 0 100)
このとき、当然、P1 と他の点の距離も近づいたり離れたりするが、最初の「100」の値を大きめにしておけば、
- d(P1,P2) は、差分で考えると2次元目のみ 1002 → 992 と、でかい値の2乗が減ることで大きく減少する
- d(P1,P3) などは、差分で考えると2次元目のみ 02 → 12 と、小さい値の2乗が増える程度である
- 仮に、他の部分の微調整の結果、P3 の2次元目が0で無かったとしても、小さい値の2乗が増減する程度
このように、でかい値の2乗が減ることの価値が大きく、他の増減は相対的に無視出来る。
対角線上の値を最大の 108 にし、頂点対それぞれに、近づける距離を微妙に変えてやる。
近い点対ほど、大きく近づけるようにすると、
P1 (100 6 1 4) (1,2)→(2,3)→(1,4)→(2,4)→(3,4)→(1,3) P2 ( 0 100 5 3) P3 ( 0 0 100 2) P4 ( 0 0 0 100)
これが条件を満たす。
E - Last 9 Digits
問題
- 正整数 X が与えられる
- n^n \equiv X \mod{10^9} となる正整数 n があるか判定し、あるなら最小のものを求めよ
- 1つの入力に Q 個のテストケースが与えられる
- 1 \le Q \le 10000
- X は2の倍数でも5の倍数でもない
解法
X は2の倍数でも5の倍数でもないという制約がだいぶ強く、n も X も下1桁が1,3,7,9に限られる。
X の下 k 桁を X_k のように表すとして、
X=12345 → X1=5, X2=45, X3=345, ...
それぞれについて、ひとまず下1桁が累乗でどう変わるかを見ていくと、
n1 = 1 のとき、1→1→1→1→1→... n1 = 3 のとき、3→9→7→1→3→... n1 = 7 のとき、7→9→3→1→7→... n1 = 9 のとき、9→1→9→1→9→...
どれも、多くとも4回収期で1にもどる。n は奇数なので、このうち2、4番目の数を下1桁目にすることはできない。
n1 = 1 のとき、1→x→1→x→1→... n1 = 3 のとき、3→x→7→x→3→... n1 = 7 のとき、7→x→3→x→7→... n1 = 9 のとき、9→x→9→x→9→...
結局、X_1=1 なら、1が遷移中に出てくるのは n_1=1 しかない、というように、n の選択肢はさらに限られることになる。
X1 = 1 のとき、n1 = 1 X1 = 3 のとき、(n1 = 3 かつ n ≡ 1 mod 4) or (n1 = 7 かつ n ≡ 3 mod 4) X1 = 7 のとき、(n1 = 7 かつ n ≡ 1 mod 4) or (n1 = 3 かつ n ≡ 3 mod 4) X1 = 9 のとき、n1 = 9
X_1=1,9 の場合
上記の通り、n_1=1 の場合にしか X_1=1 とならない。
逆に n_1=1 なら常に X_1=1 となる。
n_1=9 の場合にしか X_1=9 とならない。
逆に n_1=9 なら(指数が奇数なので)常に X_1=9 となる。
よって、下2桁目より上位には何を付け足しても、n^n と X の下1桁の合致が崩れることはない。
X_1=3,7 の場合
100が4の倍数なので、mod4 の制約を満たすかどうかは n の下2桁を見るだけで判断することができる。
X1 = 3 のとき、n2 = 13,33,53,73,93, 07,27,47,67,87 のどれか X1 = 7 のとき、n2 = 03,23,43,63,83, 17,37,57,77,97 のどれか
こうなる。候補の中から、n_2^{n_2} \equiv X \mod{100} となるかどうかを調べ、合致するもののみ残す。
ここまできたら、下3桁目より上位は何を付け足しても、n^{n} と X の下2桁の合致が崩れることはない。
より上位の桁を順に決める
どちらの場合も、ここから残りの桁 d=(2),3,4,...,9 桁目に置く数字を順番に試していきたい。
(X_1=1,9 と X_1=3,7 の上記の考察では確定する桁数が異なるが、説明が冗長になるので、X_1=3,7 の場合を例に出し、下2桁は合致済みとする。下1桁のみ合致済みの場合でも同様の議論は成り立つ)
- 方法案
- 一致済みの n_2 に対して、d=3,4,...,9 について、n_d^{n_d} \equiv X \mod{10^d} を確認し、合致したもののみ残して次の桁を試す
- 最終的に n_9 まで残った数(あれば)の中で、最も小さいものが答え
下3桁目を置いたとき、「n_3^{n_3} \equiv X \mod{10^3} なら、 その後、n_3 の上位に何を付け足しても、n^n と X の下3桁は一致する」ことが示せれば嬉しい。 (これを4,5,6,…,桁目に拡張していけば、下から順に決めていくことができることが証明できる)
4桁目以降に置く数(n を1000で切り捨て除算した数)を t として n=n_3+1000t とすると、二項定理により
\begin{eqnarray} (n_3+1000t)^{n_3+1000t} &=& {}_{n_3+1000t}C_{0} \times n_3^0 \times (1000t)^{n_3+1000t} \\ && + {}_{n_3+1000t}C_{1} \times n_3^1 \times (1000t)^{n_3+1000t-1} \\ && + ... \\ && + {}_{n_3+1000t}C_{n_3+1000t} \times n_3^{n_3+1000t} \times (1000t)^0 \\ &\equiv& n_3^{n_3+1000t} \\ &\equiv& n_3^{n_3} \times n_3^{1000t} \mod{1000} \end{eqnarray}
1000t の指数が1以上のものは \mod{1000} で消えるので、結局残るのは二項定理で分解した中の最後の項のみとなる。
ここで、オイラーの定理が使える。
- a と m が互いに素なとき、\varphi(m) を「1~m-1 のうち m と互いに素なものの個数」として、a^{\varphi(m)} \equiv 1 \mod{m}
1000 を因数 8 \cdot 125 に分解する。n_3 は偶数でも、末尾が5でも無いので、どちらとも互いに素である。
- \varphi(8)=8 \times \frac{1}{2}=4 より、n_3^4 \equiv n_3^{1000} \equiv 1 \mod{8}
- \varphi(125)=125 \times \frac{4}{5}=100 より、n_3^{100} \equiv n_3^{1000} \equiv 1 \mod{125}
よって、n_3^{1000} \equiv 1 \mod{1000} であることが言える。
最終的に、(n_3+1000t)^{n_3+1000t} \equiv n_3^{n_3} \mod{1000} となり、n^n の下3桁と n_3^{n_3} の下3桁は、4桁目以降の数 t に関わらず一致することが分かる。
4,5,6,… 桁目に対しても同様の議論が成り立つ。
ちゃんとした証明は公式Editorial参照。