【AtCoder】ABC175 Walking Takahashi

https://atcoder.jp/contests/abc175/tasks/abc175_chttps://atcoder.jp/contests/abc175/tasks/abc175_c

解答プロセス(雑)

  • 現在地は座標X

  • K回、Dだけ移動(正の方向、負の方向)

  • 移動総量はK * Dとなる

  • abs(X) - K * Dをすればいいのでは?

  • それだと現在座標が0に近い場合には答えが出せない

  • Xが正の座標の場合はX - Dを行う

  • 上記でまだXが正の場合は繰り返す。負の場合も同様

  • Xが負になった場合にはX + Dを行う

  • 上記をK回繰り返せば良さそう

  • 制約ではKが10^15なのでK回ループではTLEになる

  • 0までに何回使うのかを計算できれば良い

  • X - K*D >= 0が成立すれば良い

  • つまりKはX/Dとなる

  • KがX/D以下の場合には0を往復している場合も考慮する

  • 往復する場合は、KからX/Dを引く

  • 結果が偶数→X - (X/D * D)

  • 結果が奇数→X - (X/D * D) - D

  • 最後にabs()を使って絶対値にする

実装

#include <bits/stdc++.h>
using namespace std;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define repi(i, init, n) for (int i = init; i < (int)(n); i++)
using ll = long long;

int main()
{
  ll x, k, d;
  cin >> x >> k >> d;
  x = abs(x);

  ll ans;
  if (k <= x / d)
  {
    ans = x - k * d;
  }
  else
  {
    k -= x / d;
    x -= x / d * d;
    if (k % 2 == 1)
      x -= d;
    ans = abs(x);
  }

  cout << ans << endl;
}