切換
舊版
前往
大廳
主題

ZeroJudge - d903: 數學達人 解題心得

Not In My Back Yard | 2019-10-14 23:50:07 | 巴幣 2 | 人氣 214

題目連結:


題目大意:
給定一正整數 a (0 < a ≦100000),代表現在有平均分散的 a × a 個點。

求有多少個正方形,其四頂點皆落在這 a × a 個點上。

例如 a = 3 時,點分布為:
...
...
...
可以看到有 1 × 1 (假設相鄰頂點的長度單位為 1)有 4 個、 2 × 2 有 1 個,還有 1 個 √2 × √2 的。所以總共有 6 個正方形。




範例輸入:
1
2
3


範例輸出:
0
1
6


解題思維:
可以看到,邊長不是正整數的那些正方形,皆會落在其餘的整數邊長正方形裡。如下圖所示:
而且可以看到落在這些整數邊長的正方形裡的正方形個數恰好是邊長 - 1 。

因此,正方形之總數為
其中 i × (a - i)代表著的是從橫向(縱向)挑出兩個點。因為挑出了兩個點,所以決定了邊長,也就跟著決定了另外兩個點的位置。

接著就是計算對於挑到的該正方形+包含到的總共有多少個。因為邊長為 a - i ,所以有 a - i
- 1 個被包含的正方形(那些不是整數邊長的)。加上自己本身,所以總共有 a - i 個。

接著將上述式子展開、化簡,即可得到:


而因為運算過程中可能會超出 2 ^ 64 - 1 (unsigned long long 型態的範圍)。雖然結果可以存進去,但是運算時需要做一些調整。比如:因為上面的分子 a ^ 2 × (a ^ 2 - 1) 最後要除以分母 12 ;而在運算過程中其實可以先做除掉 2 、除掉 3 等因數之類的。

此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作