変更 (2026年7月10日)
あまりにも中途半端な記事になってしまっていたので、一旦ホームページの目次から消しました。
前記事はこちら
問題はこちら(codeforces)
注意
証明できていません。
考えたこと
1足す操作よりも先にxで割る操作をしたほうが良いことの証明
整数 t を操作することを考える。また、
P: t に1を足す操作
Q: t を x で割る操作
とする。
Pを先に行う場合を考える。
Pを n 回行った後にQを1回行った場合の操作後の値を t′ とすると、
t′=⌊xt+n⌋ここで、 t=px+r1,n=qx+r2 となるように p,q,r1,r2 を置く。( 0≤r1<x,0≤r2<x )
すると、
t′=⌊xpx+qx+r1+r2⌋=p+q+⌊xr1+r2⌋この場合、総操作回数は n+1 回である。
次に、Pを後に行う場合を考える。
Pを m 回行う場合、操作後の値を t′′とすると、
t′′=⌊xt⌋+m=p+⌊xr1⌋+m=p+mこの場合、総操作回数は m+1 回である。
上記の2つの手順を使って、同じ値にするためにかかる操作回数を比較する。
すなわち、 t′=t′′ の場合を考える。
t′=t′′p+q+⌊xr1+r2⌋=p+m⌊xr1+n⌋=mよって、以下の式が成り立つ:
mx≤r1+n<(m+1)x左の2辺より、
mx−m−r1≤n−mここから m の値によって場合分けする。
(i) m=1 の場合
mx−m−r1≤n−m の m に 1を代入する:
x−r1−1≤n−m0≤r1<x であるから、
0≤n−mm≤n(ii) m≥2 の場合
mx−m−r1=(m−1)x−m+(x−r1)≥2m−2−m+(x−r1)=(m−2)+(x−r1)≥0よって、
0≤mx−m−r1≤n−mm≤nしたがって、取りうるすべての m に対して m≤n が言えたので、Qを1回、Pを任意の回数行うときは、先にQを行った方がよいことが示された。
続き
Qを s 回( 2≤s )行うときは Q'を「 t を xs で割る」という風に定義しなおせばいいかと思ったが、割るときに切り捨てが入るので完全に等しくできない?
あとPとQを交互に行うときはどう考えればいいのか?
まとめ
証明が苦手すぎます。はい。
こういう時はこう証明するみたいな知見が全く足りていない状況なんですね。いろんな解説を読みまくるしかないか...