Problem p02719 (C++) — buggy submission, verdict: Time Limit Exceeded

#include <algorithm>
#include <cmath>
#include <iostream>
#include <string>
#include <vector>

using namespace std;

#define NOT_FOUND -1
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
/*for文のマクロ定義
rep(i,回数){
    処理
}
*/

void swap(int *a, int *b) {
  *b = *a - *b;
  *a -= *b;
  *b += *a;
}

int sosu_judge(int N) {
  /*素数ならば1
    素数でなければ0を返す
  */
  int i, j;

  if (N == 2)
    return 1;
  if (N % 2 == 0)
    return 0;

  for (i = 3; i < N && N % i != 0; i += 2)
    ;

  if (i >= N)
    return 1;

  return 0;
}

int factorial(int N) { // Nの階乗を求める関数
  int ans = 1;

  while (N--)
    ans *= (N + 1);
  return ans;
}

// クイックソートをする関数
void q_sort(int a[], int first, int last) {
  int i, j;
  int x, t;

  x = a[(first + last) / 2];
  i = first;
  j = last;

  while (1) {
    while (a[i] < x)
      i++;
    while (x < a[j])
      j--;

    if (i >= j)
      break;

    swap(&a[i], &a[j]);
    i++;
    j--;
  }
  if (first < i - 1)
    q_sort(a, first, i - 1);
  if (last > j + 1)
    q_sort(a, j + 1, last);
}

int b_search(int target, int array[], int right, int left) {
  /*二分探索を行う関数である。
    戻り値は探索したい値の格納されている位置である。
    もし値が存在しない場合、NOT_FOUND(-1)を返す
  */
  int mid;
  while (left < right) {
    mid = (right + left) / 2;
    if (array[mid] < target)
      left = mid + 1;
    else
      right = mid;
  }
  if (array[mid] == target)
    return mid;
  return NOT_FOUND;
}

unsigned long combination(int n, int r) {
  /*nCrの値を求める関数である。
    値が巨大になる可能性があるため、戻り地はunsigned longである
  */
  int i, j;
  unsigned long a[17];

  if (n - r < r)
    r = n - r;
  if (r == 0)
    return 1;
  if (r == 1)
    return n;
  if (r > 17)
    return 0;
  for (i = 1; i < r; i++)
    a[i] = i + 2;
  for (i = 3; i <= n - r + 1; i++) {
    a[0] = i;
    for (j = 1; j < r; j++)
      a[j] += a[j - 1];
  }
  return a[r - 1];
}

int main() {
  long long N, K, i, ans;
  vector<long long> dp;

  cin >> N >> K;

  if (N % K == 0) {
    cout << "0" << endl;
    return 0;
  }
  /*
      dp.push_back(N);

      for(i=0;;i++){
          dp.push_back(min(dp[i],llabs(N-K)));
          if(dp[i+1]==dp[i]) break;
          N-=K;
      }
  */
  ans = N % K;
  ans = min(ans, llabs(K - ans));
  cout << ans << endl;

  //    cout<<dp[i]<<endl;
  return 0;
}


Error: TLE

Fixed submission:

#include <algorithm>
#include <cmath>
#include <iostream>
#include <string>
#include <vector>

using namespace std;

#define NOT_FOUND -1
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
/*for文のマクロ定義
rep(i,回数){
    処理
}
*/

void swap(int *a, int *b) {
  *b = *a - *b;
  *a -= *b;
  *b += *a;
}

int sosu_judge(int N) {
  /*素数ならば1
    素数でなければ0を返す
  */
  int i, j;

  if (N == 2)
    return 1;
  if (N % 2 == 0)
    return 0;

  for (i = 3; i < N && N % i != 0; i += 2)
    ;

  if (i >= N)
    return 1;

  return 0;
}

int factorial(int N) { // Nの階乗を求める関数
  int ans = 1;

  while (N--)
    ans *= (N + 1);
  return ans;
}

// クイックソートをする関数
void q_sort(int a[], int first, int last) {
  int i, j;
  int x, t;

  x = a[(first + last) / 2];
  i = first;
  j = last;

  while (1) {
    while (a[i] < x)
      i++;
    while (x < a[j])
      j--;

    if (i >= j)
      break;

    swap(&a[i], &a[j]);
    i++;
    j--;
  }
  if (first < i - 1)
    q_sort(a, first, i - 1);
  if (last > j + 1)
    q_sort(a, j + 1, last);
}

int b_search(int target, int array[], int right, int left) {
  /*二分探索を行う関数である。
    戻り値は探索したい値の格納されている位置である。
    もし値が存在しない場合、NOT_FOUND(-1)を返す
  */
  int mid;
  while (left < right) {
    mid = (right + left) / 2;
    if (array[mid] < target)
      left = mid + 1;
    else
      right = mid;
  }
  if (array[mid] == target)
    return mid;
  return NOT_FOUND;
}

unsigned long combination(int n, int r) {
  /*nCrの値を求める関数である。
    値が巨大になる可能性があるため、戻り地はunsigned longである
  */
  int i, j;
  unsigned long a[17];

  if (n - r < r)
    r = n - r;
  if (r == 0)
    return 1;
  if (r == 1)
    return n;
  if (r > 17)
    return 0;
  for (i = 1; i < r; i++)
    a[i] = i + 2;
  for (i = 3; i <= n - r + 1; i++) {
    a[0] = i;
    for (j = 1; j < r; j++)
      a[j] += a[j - 1];
  }
  return a[r - 1];
}

int main() {
  long long N, K, i;
  vector<long long> dp;

  cin >> N >> K;

  if (N % K == 0) {
    cout << "0" << endl;
    return 0;
  }

  dp.push_back(N);

  for (i = 0;; i++) {
    dp.push_back(min(dp[i], llabs(N - K)));
    if (dp[i + 1] == dp[i])
      break;
    N -= K;
  }

  cout << dp[i] << endl;
  return 0;
}