Processing math: 100%
Solutions of Prison - ReimuOJ: Reimu Online Judge

Solutions of Prison

Select solution language

Write solution here.


User Avatar noice    Created at    7 likes

## Bài toán yêu cầu bạn tìm thời điểm ngày, tháng, năm sau x ngày. ## Một hướng giải là tính xem bao nhiêu ngày đã trôi qua từ ngày đầu tiên (cho là bắt đầu từ 1/1/1) đến thời điểm hiện tại. Sau đó chuyển tổng số ngày đó thành số năm, số tháng, số ngày. Có thể giải như sau: - Tính số ngày đã qua từ ngày đầu năm. Ví dụ, nếu như là ngày 22/2/2025, thì tính số ngày đã qua từ 1/1/2025. Bạn cũng nên lưu ý [năm nhuận](https://vi.wikipedia.org/wiki/N%C4%83m_nhu%E1%BA%ADn#L%E1%BB%8Bch_Gregorius). - Tính số ngày còn lại từ ngày 1/1/1. Bạn có thể sử dụng [Nguyên lý Bao hàm - Loại trừ](https://vi.wikipedia.org/wiki/Nguy%C3%AAn_l%C3%BD_bao_h%C3%A0m-lo%E1%BA%A1i_tr%E1%BB%AB#%C4%90%E1%BA%BFm_s%E1%BB%91_nguy%C3%AAn) để tìm số ngày trong năm. Cụ thể hơn, gọi số ngày cần tìm là d, và xét trong y năm: d=365y+y4+y400  y100  - Từ đó, bạn tìm số năm thông qua tổng số ngày trong một lượng 400 năm, vì các năm nhuận phân bố theo một chu kỳ. Bạn dễ dàng tìm được đáp án cho bài toán sau khi vét các ngày còn dư. ### Code tham khảo: ` #include <bits/stdc++.h> using namespace std; #define int long long #define endl '\n' int dim[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; bool leap(int a) { return (a % 400 == 0 || (a % 4 == 0 && a % 100 != 0)); } signed main() { ios::sync_with_stdio(false); cin.tie(nullptr); int x, d, m, y; cin >> x >> d >> m >> y; int epoch = d; for (int i = 1; i < m; ++i) epoch += dim[i - 1]; if (leap(y) && m > 2) ++epoch; --y; epoch += y * 365 + y / 4 - y / 100 + y / 400; epoch += x; int Y = (epoch / 146097) * 400; epoch %= 146097; int yy = 1, D, M; while (epoch > 0) { int dd = (leap(yy) ? 366 : 365); if (epoch >= dd) { epoch -= dd; ++yy; continue; } dim[1] = (leap(yy) ? 29 : 28); D = epoch, M = 1; for (int i = 0; i < 12; ++i) { if (D <= dim[i]) { M = i + 1; break; } D -= dim[i]; } break; } cout << D << ' ' << M << ' ' << (Y + yy); }