Problem p02696 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

// マクロ
// forループ関係
// 引数は、(ループ内変数,動く範囲)か(ループ内変数,始めの数,終わりの数)、のどちらか
// Dがついてないものはループ変数は1ずつインクリメントされ、Dがついてるものはループ変数は1ずつデクリメントされる
#define REP(i, n) for (ll i = 0; i < (ll)(n); i++)
#define REPD(i, n) for (ll i = n - 1; i >= 0; i--)
#define FOR(i, a, b) for (ll i = a; i <= (ll)(b); i++)
#define FORD(i, a, b) for (ll i = a; i >= (ll)(b); i--)
// xにはvectorなどのコンテナ
#define ALL(x) (x).begin(), (x).end() // sortなどの引数を省略したい
#define SIZE(x) ((ll)(x).size())      // sizeをsize_tからllに直しておく
#define MAX(x) *max_element(ALL(x))   // 最大値を求める
#define MIN(x) *min_element(ALL(x))   // 最小値を求める
#define D()
// 定数
#define INF 1000000000000 // 10^12:極めて大きい値,∞
#define MOD 10000007      // 10^9+7:合同式の法
#define MAXR 100000 // 10^5:配列の最大のrange(素数列挙などで使用)
// 略記
#define PB push_back // vectorヘの挿入
#define MP make_pair // pairのコンストラクタ
#define F first      // pairの一つ目の要素
#define S second     // pairの二つ目の要素

int main(void) {
  long double A, B, N;
  cin >> A >> B >> N;
  long int max = 0, n = A;
  if (A > B) {
    n = B;
  }
  if (n >= N) {
    for (long int i = 0; i <= N; ++i) {
      // printf("%Lf\n",(floor(A*i/B)- A*floor(i/B)));
      if (floor(A * i / B) - A * floor(i / B) > max) {
        max = floor(A * i / B) - A * floor(i / B);
      }
    }
  } else {
    for (long int i = 0; i <= n; ++i) {
      // printf("%Lf\n",(floor(A*i/B)- A*floor(i/B)));
      if (floor(A * i / B) - A * floor(i / B) > max) {
        max = floor(A * i / B) - A * floor(i / B);
      }
    }
    for (long int i = N; i >= N - n * 1000000; --i) {
      // printf("%Lf\n",(floor(A*i/B)- A*floor(i/B)));
      if (floor(A * i / B) - A * floor(i / B) > max) {
        max = floor(A * i / B) - A * floor(i / B);
      }
    }
  }
  /* for(long int i=0; i<=N; i = i + n){
       printf("%Lf\n",(floor(A*i/B)- A*floor(i/B)));
   if(floor(A*i/B)- A*floor(i/B) > max){
       max = floor(A*i/B)- A*floor(i/B);
   }
   }

*/

  printf("%ld\n", max);
  return 0;
}

Fixed submission:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

// マクロ
// forループ関係
// 引数は、(ループ内変数,動く範囲)か(ループ内変数,始めの数,終わりの数)、のどちらか
// Dがついてないものはループ変数は1ずつインクリメントされ、Dがついてるものはループ変数は1ずつデクリメントされる
#define REP(i, n) for (ll i = 0; i < (ll)(n); i++)
#define REPD(i, n) for (ll i = n - 1; i >= 0; i--)
#define FOR(i, a, b) for (ll i = a; i <= (ll)(b); i++)
#define FORD(i, a, b) for (ll i = a; i >= (ll)(b); i--)
// xにはvectorなどのコンテナ
#define ALL(x) (x).begin(), (x).end() // sortなどの引数を省略したい
#define SIZE(x) ((ll)(x).size())      // sizeをsize_tからllに直しておく
#define MAX(x) *max_element(ALL(x))   // 最大値を求める
#define MIN(x) *min_element(ALL(x))   // 最小値を求める
#define D()
// 定数
#define INF 1000000000000 // 10^12:極めて大きい値,∞
#define MOD 10000007      // 10^9+7:合同式の法
#define MAXR 100000 // 10^5:配列の最大のrange(素数列挙などで使用)
// 略記
#define PB push_back // vectorヘの挿入
#define MP make_pair // pairのコンストラクタ
#define F first      // pairの一つ目の要素
#define S second     // pairの二つ目の要素

int main(void) {
  long double A, B, N;
  cin >> A >> B >> N;
  long int max = 0, n = A;
  if (A > B) {
    n = B;
  }
  if (n >= N) {
    for (long int i = 0; i <= N; ++i) {
      // printf("%Lf\n",(floor(A*i/B)- A*floor(i/B)));
      if (floor(A * i / B) - A * floor(i / B) > max) {
        max = floor(A * i / B) - A * floor(i / B);
      }
    }
  } else {
    for (long int i = 0; i <= n; ++i) {
      // printf("%Lf\n",(floor(A*i/B)- A*floor(i/B)));
      if (floor(A * i / B) - A * floor(i / B) > max) {
        max = floor(A * i / B) - A * floor(i / B);
      }
    }
    if (B <= N) {
      for (long int i = B; i >= B - n; --i) {
        // printf("%Lf\n",(floor(A*i/B)- A*floor(i/B)));
        if (floor(A * i / B) - A * floor(i / B) > max) {
          max = floor(A * i / B) - A * floor(i / B);
        }
      }
    }
    for (long int i = N; i >= N - n; --i) {
      // printf("%Lf\n",(floor(A*i/B)- A*floor(i/B)));
      if (floor(A * i / B) - A * floor(i / B) > max) {
        max = floor(A * i / B) - A * floor(i / B);
      }
    }
  }
  /* for(long int i=0; i<=N; i = i + n){
       printf("%Lf\n",(floor(A*i/B)- A*floor(i/B)));
   if(floor(A*i/B)- A*floor(i/B) > max){
       max = floor(A*i/B)- A*floor(i/B);
   }
   }

*/

  printf("%ld\n", max);
  return 0;
}