題解 無語凝噎

2022-05-05 19:42:09 字數 2297 閱讀 3662

寒蟬淒切,對長亭晚,驟雨初歇。都門帳飲無緒,留戀處,蘭舟催發。執手相看淚眼,竟無語凝噎。念去去,千里煙波,暮靄沉沉楚天闊。

多情自古傷離別,更那堪,冷落清秋節!今宵酒醒何處?楊柳岸,曉風殘月。 此去經年,應是良辰好景虛設。便縱有千種風情,更與何人說! ——宋·柳永《雨霖鈴》

字雖好,只是柳永傷感。執手相看淚眼,竟無語凝噎。太不合此情此景。 ——愛新覺羅氏胤禛

西施與范蠡泛舟而去……不對,場景不對,咳咳。在甄嬛前往蓬萊洲之前,她與皇上在碧桐書院告別。為了這可能會長達數月的離別,兩個人都似乎有很多話要對對方說,卻都無語凝噎。

這時,皇上突然發話:「嬛嬛啊,既然你我都說不出話來,那這時間也不好打發,我們來數三角形吧。」為了滿足皇上突發而來的童趣,甄嬛欣然陪同了。可這……

紙上是一張 \(n\times m\) 的格仔方陣,即有 \((n+1)\times (m+1)\) 個格點。每個格仔都是邊長為 \(1\) 的正方形。而他們要數的,則是任取 \(3\) 個格點作為三角形的頂點所形成的直角三角形且該三角形面積為 \(\dfrac\) 的個數。甄嬛數得頭都暈了,她現在只想知道滿足條件的三角形個數 \(\bmod\)

第一行 \(3\) 個正整數 \(n\)、\(m\)、\(s\),意義如題。

僅乙個整數,為滿足條件的三角形個數 \(\bmod\)。

源程式檔名為wordless.*,其中*為所用語言的源程式拓展名。

wordless.in讀入,輸出至wordless.out中。

評測時間限制 \(1000\ \textrm\),空間限制 \(128\ \textrm\)。

題目大意是說,給你乙個 \(n\times m\) 的點陣,求出所有由格點作為頂點的直角三角形總數。

本題的難點在於,平面格點上不一定只有直角邊平行於座標軸的直角三角形,還有「斜著」的。如何統計這類三角形是重中之重。

列舉所有組合,檢查是否合法即可。

這種情況比較特別。其實可以分成兩類

平著的三角形

顯然,即邊長只能是乙個為 \(1\),另乙個為 \(s\)。雖然這並沒有什麼大作用。

斜著的三角形

這就會比一般情況簡單很多,因為只有可能是邊長為 \(\sqrt\) 的等腰直角三角形,易證。

所以,我們只要考慮如何才能統計等腰直角三角形的數量即可。

仿照上面,我們驚奇地發現了兩個全等三角形:

我們利用這一點,把這個等腰直角三角形放進乙個長方形內,也有 \(4\) 種方案。

這樣,這檔分就可以了。

其實,這個圖就是我們完成的關鍵。我們很容易證明,一組等腰三角形必然對應著乙個唯一的邊平行於座標軸的最小外界長方形。

這個「一組」可能是 \(4\) 個,也有可能是 \(2\) 個,取決於這個等腰三角形的方向。如果兩條直角邊正好與座標軸構成了 \(45^\) 還等腰就只有倆。

而這個長方形的大小,就需要外面那對相似三角形來確定。因為並不一定等腰,所以我們並不能直接得到相似比。

我們設(上面那個圖)

\[\large=k}

\]則易得

\[\large

\]不妨設 \(k\le 1\),我們就可以很輕鬆地算出長方形的長和寬。

同時,我們只需要列舉 \(a\) 和 \(b\) 就可以求出所有的三角形。

這就是滿分做法的核心部件。

雖然挺煩的,但是鍛鍊一下碼力也是不錯的。

#include #include using namespace std;

typedef long long ll;

const int mod = 1e9 + 7;

inline bool is_int(double b)

inline int read()

if (ch == '-')

while (isdigit(ch))

return n * t;

}int main()

for (int j = i; i * i + j * j <= s; j++)

} }

printf("%lld\n", ans);

return 0;

}

一道有意思的模擬題,雖然摻雜了一點數學知識。

做題時,這種題一般很無聊,但做上幾題其實也沒有什麼壞處。