\(PS\):符號 \([\ \rm P\ ]\) 的意義是:當表達式 \(\rm P\) 為真則取值為 \(1\),為假則取值為 \(0\)。
題目大意
給你一個一天有 \(H\) 小時、一小時有 \(M\) 分鍾的表和一個正整數 \(A\),問一天內有多少個整數時刻,使得分針與時針的夾角小於等於 \(\displaystyle\frac{2\pi A}{HM}\)。
題目分析
易知分針轉速 \(w_1=\displaystyle \frac{2\pi}{M}\),時針轉速 \(w_2=\displaystyle\frac{2\pi}{HM}\),設當前時刻為 \(T\);
一天有 \(HM\) 個整數時刻,即 \(T\in[0,HM)\);
於是對於每一個時刻,我們判斷一下兩個指針的夾角 \(\theta\) 是否小於等於 \(\displaystyle\frac{2\pi A}{HM}\) ,滿足就貢獻加加,最后輸出總貢獻即可。
方法一:數論
對於任意時刻 \(T\) 與兩指針間的夾角 \(\theta\),顯然有:
注意到 \(\theta\in[0,2\pi]\),所以還要對 \(2\pi\) 取個模(分針轉一圈又轉回來了),即:
同時因為兩個指針之間的夾角可以選到兩個數值,逆時針轉有一個夾角,順時針轉有一個夾角,這里我們肯定是選更小的角來判斷是否滿足條件,即最終我們要求的是:
可以轉化為:
把 \(\theta=\displaystyle\frac{2\pi(H-1)T}{HM}\mod{2\pi}\) 代入並化簡得:
此時我們其實就可以把 \(HM\) 看作是 \(2\pi\),\(H-1\) 看作是每過一個時刻兩個指針夾角的變化量,然后分兩種情況考慮:
問題等價於“一天內有多少個整數時刻,使得分針與時針的夾角小於等於 \(\pi\)”,顯然每個時刻都滿足(如果順時針看夾角大於 \(\pi\),那逆時針看一定小於,反之亦然),此時答案為 \(HM\),特判即可;
若有 \(T(H-1)\mod{HM}\leq A\),則一定不會有 \(T(H-1)\mod{HM}\geq HM-A\),所以答案就是這兩部分的貢獻相加,同時我們令 \(G=\gcd(H-1,HM)\)。
先計算式子的左邊:
當 \(G=1\) 時 ,因為 \(T\in[0,HM)\),構成了一個模 \(HM\) 的完全剩余系,由完全剩余系的性質可得 \(T(H-1)\mod{HM}\) 也是一個完全剩余系,即它一定取遍了 \(0\sim HM-1\) 的每一個數,此時我們就不用關心到底在哪個時刻造成了貢獻,只需知道范圍內有多少個數滿足小於等於 \(A\) 即可,顯然有 \(0\sim A\) 總共 \(A+1\) 個數滿足,因此這部分的貢獻就是 \(A+1\)。
當 \(G\neq1\) 時,我們利用同余的一個性質: \(\displaystyle ac\equiv bc\pmod d\iff a\equiv b\pmod{\frac{d}{(c,d)}}\),把式子轉化為:
相當於我們把 \(T\in[0,HM)\) 平均分成了 \(G\) 段,每一段的 \(T\) 都構成了一個模 \(\displaystyle\frac{HM}{G}\) 的完全剩余系,此時這里的每一段其實就等價於上面 \(G=1\) 的情況,只是 \(T\) 的范圍和模數變了下而已,因此每段都造成了 \(\displaystyle \lfloor\frac AG\rfloor+1\) 的貢獻,左邊的總貢獻就是 \(G*(\displaystyle \lfloor\frac AG\rfloor+1)\)。
再看式子右邊:
同樣地,當 \(G=1\) 時,跟上面一樣分析一波,發現其實是一樣的思路(顯然左邊跟右邊造成的貢獻是對稱的),只不過因為 \(T\) 不能取到 \(HM\),所以貢獻只有 \(A\)(\(HM-A\sim HM-1\) 共有 \(A\) 個數)。
當 \(G\neq1\) 時,也同上,把 \(T\) 分成 \(G\) 段,右邊的總貢獻就是 \(G*\displaystyle \lfloor\frac AG\rfloor\)。
因此最終答案就是左邊貢獻和右邊貢獻之和,即 \(G*(\displaystyle 2\lfloor\frac AG\rfloor+1)\)。
#include<bits/stdc++.h>
using namespace std;
int main(){
long long H,M,A;
cin >> H >> M >> A;
if(H*M==A*2){
cout << H*M;
}
else {
long long G=__gcd(H-1,H*M);
cout << G*(2*(A/G)+1);
}
}
方法二:類歐幾里得
待填坑~~
