0w1

Yuki 87 Advent Calendar Problem ( Periodic )

No.87 Advent Calendar Problem - yukicoder
閏年じゃない場合は 365 日で、365 % 7 = 1 日だけ、前の年の同じ日に対応する曜日がずれる ( 増える )。閏年だと 2 日ずれ、循環する周期を探す意味で計算してみると、その周期は 400 年だと分かる。

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

int uru( int x ){
  if( x % 400 == 0 )
    return 1;
  if( x % 100 == 0 )
    return 0;
  return x % 4 == 0;
}

signed main(){
  ll N; cin >> N;
  ll ans = 0;
  for( int i = 1, z = 0; i <= 400; ++i )
    ( z += 365 + uru( 2014 + i ) ) %= 7,
    ans += z == 0;
  ans *= ( N - 2014 ) / 400;
  for( int i = 1, z = 0; i <= ( N - 2014 ) % 400; ++i )
    ( z += 365 + uru( 2014 + i ) ) %= 7,
    ans += z == 0;
  cout << ans << endl; 
  return 0;
}