第二回日本最強プログラマー学生選手権

色々ミスってA,Bしかできませんでした。・゚・(ノД`)・゚・。
Dまでは解くべき内容だったと思います.
ちゃんと復習しないと...

A - Competition

【解答1 (公式解説)】
同じ値段設定なら,$(Y/X)\cdot Z$円.これより小さい整数のうち,最大のものは,$(Y/X)\cdot Z$が整数でない場合は小数点以下を切り捨てたもの,整数の場合は1引いたもので表せる.

これは,$(Y/X)\cdot Z$の小数点以下(あるいは1の可能性もある)として最大の数$1/X$(以下の値)を引いた上で,小数点以下を切り捨てれば求められる.つまり,$\lfloor(Y/X)\cdot Z - 1/X \rfloor$で求められる(math.floor()で計算できる).

【解答2】
同じ値段なら$(Y/X)\cdot Z$円.これが整数でない場合は小数点以下を切り捨てた値,整数の場合は1円小さい値が答えになる.これはまとめて$\lceil (Y/X)\cdot Z - 1\rceil$と表せる(math.ceil()で計算できる).

B - Xor of Sequences

公式解説の通り.Pythonでは集合の差分(対称差集合)が簡単に計算できる(Python, set型で集合演算(和集合、積集合や部分集合の判定など) | note.nkmk.me).あとはリストにしてソートすれば良い.

C - Max GCD 2

ループさせる候補は①$x,y,$か②$\mathrm{gcd\,}(x,y)$の候補($1\sim B-1$).①は$A,B$の範囲から不可.$X$以下の$c$の倍数の個数=$X\div c$の商だから,$[A,B]$に$c$の倍数が2つ以上ある条件は$\lfloor B/c \rfloor - \lfloor (A-1)/c \rfloor \geq 2$.この方針で,大きいほうから候補を確かめていけば良い.

A, B = map(int, input().split())
for c in reversed(range(1,B)):
    if B//c - (A-1)//c >=2:
        exit(print(c))

D - Nowhere P

$i=1,2,...,N$,$A_{k}=1,2,...,P-1$に対して
\begin{aligned}
x_{i}
=\sum_{k=1}^{i} A_{k} \not\equiv 0 \pmod P
\end{aligned}
となる数列$\{A_{k}\}_{k=1}^{N}$の数を求める問題.

まず,$x_{1}=A_{1}$の選び方は$P-1$通りある.

$x_{i-1}$が決まったとき,$x_{i-1} \equiv 1,...,P-1 \pmod P$のそれぞれの場合に対して,$x_{i} \not\equiv 0 \pmod P$を満たす$A_{i}$の選び方は$P-2$通りある.

よって,帰納的に$x_{N}$の選び方は$(P-1)(P-2)^{N-1}$通りとなる.

E - Level K Palindrome

F - Max Matrix

G - Spanning Tree

H - Shipping