題目
題解
分針的轉速為\(w_1=\frac{2\pi }{M}\),時針的轉速為\(w_2=\frac{2\pi}{MH}\)。因此經過時間\(T\)后,角度差為
\[\Delta \theta=T(w_1-w_2) \mod 2\pi=\frac{2\pi (H-1)T}{MH} \mod 2\pi \]
這個角度的意義是從時針出發指向分針所經過的角度,這個角度可能大於\(\pi\),此時對應的真正的夾角應該是用\(2\pi\)減去這角度,因此原題轉換為滿足
\[\Delta \theta \le \frac{2\pi A}{MH} \]
或
\[\Delta \theta \ge 2\pi - \frac{2\pi A}{MH} \]
的所有\(T\)。經過一些簡單的化簡,即求滿足
\[T(H-1) \mod HM \le A \\ T(H-1) \mod HM \ge MH - A \]
的\(T\)有多少個,注意\(T\)的取值范圍為\([0,MH)\)。這很關鍵。
假設\(d=\gcd(H-1, HM) \neq 1\),那么有
\[T\frac{H-1}{d} \mod \frac{MH}{d} \le \lfloor \frac{A}{d} \rfloor \\ T\frac{H-1}{d} \mod \frac{MH}{d} \ge \lceil \frac{MH-A}{d} \rceil \\ \]
這里是因為
\[A\cdot B \le C \Leftrightarrow A \le \lfloor \frac{C}{B} \rfloor \\ A\cdot B \ge C \Leftrightarrow A \ge \lceil \frac{C}{B} \rceil \]
這樣一來\(\frac{H-1}{d}\)就和\(\frac{MH}{d}\)就互質了。由離散數學,這樣不同的\(T\)恰好一共有\(\frac{MH}{d}\)個值了,即\([0,\frac{MH}{d})\)中每個值都能被取得。一輪下來一共有\(\lfloor \frac{A}{d} \rfloor+1\)和\(\frac{MH}{d}-\lceil \frac{MH-A}{d} \rceil\)個\(T\)符合條件。由於一共有\(d\)輪循環,故答案為
\[d \cdot (\lfloor \frac{A}{d} \rfloor+1+\frac{MH}{d}-\lceil \frac{MH-A}{d} \rceil) \]
注意,如果\(A=\frac{MH}{2}\),即\(\pi\),這樣在等號部分會重復計算。故這種情況要特判斷嗎,此時答案為\(MH\)。
#include <bits/stdc++.h>
#define endl '\n'
#define IOS std::ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define mp make_pair
#define seteps(N) fixed << setprecision(N)
typedef long long ll;
using namespace std;
/*-----------------------------------------------------------------*/
ll gcd(ll a, ll b) {return b ? gcd(b, a % b) : a;}
#define INF 0x3f3f3f3f
const int N = 3e5 + 10;
const double eps = 1e-5;
ll up(ll x, ll k) {
return x / k + (x % k != 0);
}
int main() {
IOS;
ll h, m, a;
cin >> h >> m >> a;
ll d = gcd(h - 1, h * m);
if(2 * a == m * h) cout << m * h << endl;
else cout << (a / d + 1) * d + (m * h / d - up(m * h - a, d) ) * d << endl;
}