おじさんの競プロ記録

自分の力で解答できた問題を振り返り、理解を深めたいです。

CODE FESTIVAL 2014 予選A C - 2月29日

問題について考えたこと

問題文へ

入力が {2 \times 10 ^9} と非常に大きいことから、ループによる計算はやめました。

AとBのそれぞれの個数を計算して、BからAを引く。その際はAがちょうどうるう年である時に気をつけます。

#define _GIBCXX_DEBUG
#include <bits/stdc++.h>
using namespace std;
#define rep(i, n) for (int i = 0; i < (n); ++i)
#define all(v) v.begin(), v.end()
using namespace std;
using ll = long long;

ll solve(ll n) {
  ll result = 0;

  result = n / 400 * 97;
  ll remainder = n % 400;

  for (ll i = 1; i <= remainder; ++i) {
    if (i % 4 == 0 && i % 100 != 0) ++result;
  }


  return result;
}


int main(void) {
  ll A, B;
  cin >> A >> B;

  ll a = solve(A);
  ll b = solve(B);
  
  ll ans = b - a;

  if (A % 4 == 0) {
    if (A % 400 == 0) {
      ++ans;
    } else if (A % 100 != 0) {
      ++ans;
    }
  }

  cout << ans << endl;
  
  return 0;
}