AOJ 1179 Millennium
問題
Millennium | Aizu Online Judge
- 変則的な暦でy年m月d日から1000年1月1日まで何日あるかを数える
- 一年は10ヶ月で、通常の年は20日ある月と19日ある月が交互に訪れる
- 3の倍数の年は全ての月が20日ある
方針
- 1年1月1日を1日目として、y年m月d日が何日目かを求め、1000年1月1日(=196471日目)との差を求める
- 年を数えるときは3年単位で考えると590(=195+195+200)日あり、余りの年は195日あることを使った。
- 月を足す時はうるう年でないときを補正
- 日を足すのはそのまま
コード
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define rep(i, n) for(int i=0; i<(n); ++i) int main(void){ int n; int y, m, d; cin >> n; rep(loop, n) { cin >> y >> m >> d; int day = 0; day += d; day += 20 * (m-1); if(y%3 != 0) day -= (m-1)/2; day += 590 * ((y-1) / 3); day += 195 * ((y-1) % 3); cout << 196471-day << endl; } }
http://judge.u-aizu.ac.jp/onlinejudge/review.jsp?rid=1885158
反省
day = (y-1)*195 + (y-1)/3*5 + 20*(m-1) - min(1, y%3)*((m-1)/2) + d
とすれば1行で書けた