2020 icpc 沈陽 I - Rise of Shadows(思維)


題目

source

題解

分針的轉速為\(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;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM