1. 程式人生 > 其它 >uniapp tabBar 智配app ios版本 url跳轉傳參不支援中文,需要轉碼,一定要轉碼!!!

uniapp tabBar 智配app ios版本 url跳轉傳參不支援中文,需要轉碼,一定要轉碼!!!

P3166 數三角形

過的第一篇紫題,特此發一篇部落格慶祝一下

思路

obviously,總體思路大概為這樣的:【三角形數量】等於【任選三個點的方案數】減去【三點共線方案數】

因為是一個N·M的方格,所以共有(n+1)·(m+1)的點,那麼由組合數可得【三個點的方案數】為$C_{(n+1)(m+1)}^3$

so現在我們只需要知道三點共線的方案數即可

【三點共線的方案數】等於【橫著的】加上【豎著的】加上【斜著的】

接下來我們就要分類討論了:

【橫著的】:

指三點所在直線平行於 x 軸。共有 m+1 條橫線,每條橫線上有 n+1 個點,從這 n+1 個點中選取 3 個,方案數為 (m+1)$C_{n+1}^3$

那麼同理,【豎著的】指三點所在直線平行於 y 軸,方案數為(n+1)$C_{m+1}^3$

最難的是【斜著的】,斜著的直線按斜率正負分為兩種,並且這兩種方案數是相等(obviously)所以,我們只需要計算出斜率為正的方案數,再乘2就完了(好像很簡單)

方便起見,我們將斜率為正的方案數記為ans



解決

通過觀察可以發現一個小小的結論:

假設網格中AB平行於底邊x軸,長度為i,BC平行於側邊y軸,長度為j,那麼AC上的整點數為gcd(i , j) + 1(這個很好發現)

那麼我們就可以列舉兩點橫座標差 i,縱座標差 j,則兩點連線上的整點數量為 gcd(i , j) + 1不算兩端點自身的話有 gcd(i , j) − 1 個)

對於每組橫座標差 i,縱座標差 j 的點對,我們先選取兩端點,再在他倆之間的 gcd(i , j) - 1 個點中任選一個作為第三個點,方案數為 gcd(i , j) - 1

每組點對可以有 gcd(i , j) - 1 種方案,像這樣橫座標差 i,縱座標差 j 的點對共有 (n - i + 1)(m - j + 1) 個,故可以列舉 i , j 計算:$\sum_{i=1}^n\sum_{j=1}^m$(n - i + 1)(m - j + 1)(gcd(i , j) - 1 )

當然,直接計算這個式子時間複雜度為O(nm)=O($n^2$),考慮gcd的話甚至是O($n^2\log n$)(但是對於這題還是綽綽有餘的,畢竟資料太水了


****看了題解後發現竟然還有O(n)的方法,不過本人太菜了,沒有看懂(蒟蒻)