競技プログラミング日記

主に AtCoder の記事です

アルゴリズムと数学089 - Log Inequality 2

アルゴリズムと数学089 - Log Inequality 2

解法

式を同値変形すると, \(a < c^{b}\). 桁あふれに注意して冪を計算する. \(a\)より大きいかだけが問題になるので, \(a\)の最大値よりも大きい値は区別する必要がないので, 気持ちとしては \(\infty\) の様にまとめてしまう. 実装では,\(\infty\)の代わりに定数で扱う.

実装

\(c\)の冪を計算するが, \(pow*c \leq inf\) としてしまうと, \(pow\)と\(c\)が \(10^{18}\)に近い場合等に桁あふれが起きる. 代わりに,同値な式 \(pow \leq \lfloor inf/c \rfloor\) で判定する.

注意

1e18 + 5, 1e18 + 10 などは,1e18 となってしまう. 先にキャストしてから和をとり,(ll)1e18 + 5 などで回避できる.

使っている記号,マクロ等 "https://ecsmtlir.hatenablog.com/entry/2022/12/23/131925"

ll pow(ll c, ll b){
  if(c == 1) return 1;

  const ll inf = 2e18;
  ll pow = 1;
  rep(i,b){
    if(pow <= inf/c) pow *= c;
    else return inf;
  }
  return pow;
}

int main() {
  ll a,b,c; cin >> a >> b >> c;

  yesno(a < pow(c,b));

  return 0;
}