Loading [MathJax]/jax/output/CommonHTML/jax.js

AtCoder Beginner Contest 322 G問題メモ

G - Two Kinds of Base

問題

  • N,X が与えられる
  • 同じ数字の並び S=(S1,S2,...) を2つの異なる進数 a,b で解釈することを考える
    • (1,0,1,1,0) を2進数で解釈したら22、3進数で解釈したら93となる
  • それぞれを10進数に変換したときの差がちょうど X になるような (S,a,b) の組の個数を求めよ
  • ただし、以下を全て満たすものとする
    • a,bN
    • 0Si<min(10,a,b)
    • 1S1
  • 1N109
  • 1X2×105

解法

指数を含む計算式の結果は、文字通り指数的に増えていくので、実は探索する範囲は広くない。適切に範囲を絞って全探索できる。

以下、表記の簡単さのため、S の長さを k+1 として、添字を (Sk,Sk1,...,S0) とする。
a 進数と解釈して10進数になおす操作を f(S,a) とすると、f(S,a)=akSk+ak1Sk1+...+S0 となる。

k=1 のとき

  • f(S,a)f(S,b)=(ab)S1=X

S0 は何でもよい。min(10,a,b) だけの自由度がある。

S119 まで全探索する。

  • S1X を割り切れないとダメ
    • 割り切れる場合、商を d として、d=ab となる
  • Na=b+d>b>S1 を満たすような a,b に対し、それぞれ min(10,b) の答えがある

S1N に挟まれた制約から、条件を満たす a,b の個数が計算できる。

k2 のとき

こちらも S0 は何でもよい。(Sk,...,S1,a,b) の組毎に、min(10,b) だけの自由度がある。

具体的に k=3 などとすると、以下のようになる。

  • f(S,a)f(S,b)=(a3b3)S3+(a2b2)S2+(ab)S1=X

kba の順に探索する。(別にこの通りでなくてもいいが、ここではこれで進める)

k があんまり大きくなったらどんなに a,b を小さくしても X を超えてしまう。
(a,b) の下限は (3,2) なので、k=12527345 となり X の上限を超えるので、探索範囲は多くない。

なので、まずは k を探索する。

次に b を最小の2から順に増やして探索する。
ここでも、(b+1)kbk>X になったら、もうこれ以上増やしても適切な組は見つからないので打ち切れる。

次に a の範囲を考えるときに重要な要素として、以下の制約がある。

  • akbk,ak1bk1,...,ab は全て、ab を因数に持つ
  • つまり、abX を割り切れないといけない

また、以下の事実がある(①)。

  • akbk>(b1)(ak1bk1+...+ab)

証明

①の式が表すのはつまり、S を上位桁から決めていくときに、「Sk をあと1増やしても X を超えない」状況だったら、そこで増やさないと、k1 以降の桁を最大まで上げても X に足りなくなるということ。

(例)(a,b)=(7,3), k=4, X=5000

a^k - b^k = 7^4 - 3^4 = 2320  →  5000/2320 = 2.155... なので、S4 は最大 2 にできる

このとき、S4 = 1 などにしてしまうと、S3,S2,S1 を全て最大(b-1 = 2)にしても、

(a^3-b^3)*2 + (a^2-b^2)*2 + (a-b)*2 = 720 < 2320

なので、2320減らした分を補えない。(他のa,b,k,Xでも必ずこうなる)
よって、S4 は最大の 2 にする必要がある。

a,b,k が決まったら、上位桁 t=k,k1,...,1 から atbt が取れる最大限まで貪欲に取るしかないことになる。
特に、最高次数 SkXakbk となる。

また Sk1Sk<min(10,b) の範囲にないといけないことを考えると、(切り捨てとか些細な誤差は無視して)変形して

  • kXmin(10,b)+bk<akX+bk

この範囲となる。各 a に対し実際にテストする。

  • abX を割り切るか?
  • 割り切る場合、貪欲に上位桁から決めていったら各桁 Simin(10,b) に収まるか?

上手くいったら、S0 の自由度 min(10,b) だけ答えに加算する。

Python3

programming_algorithm/contest_history/atcoder/2023/0930_abc322.txt · 最終更新: by ikatakos
CC Attribution 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0