1. 程式人生 > >NOIP2015普及組第3題——sum

NOIP2015普及組第3題——sum

1. 原題

2. 解題思路

列舉所有的 x、z 再判斷是否符合條件並求和,是大部分人都能想到的做法,不過只能拿到 40 分。其實這樣的列舉方式是有優化餘地的,題目要求的 x 和 z 必須是奇偶性相同的,否則不存在正整數 y 滿足題意。另外 x 和 z 的顏色需要相同,因此只有奇偶性相同、顏色也相同的格子兩兩之間才會產生分數。

但這樣還是不夠快速,計算分數時其實不需要逐一列舉求和。( x + z ) · ( number_x + number_z ) = x · number_x + z · number_z + x · number_z + z · number_x,其中 x · number_x 只依賴於 x,可以預處理其累計和(d [ 顏色 ] [ 奇偶性 ])。假設同一種顏色、奇偶性的格子一共有 s 個(可以預處理計算),那麼每個 x · number_x 都在分數和中出現了 ( s - 1 ) 次,即和其他的 s - 1 個格子作為 x 和 z 配對產生的和(x < z,任何 2 個格子只可能產生 1 次和)。

z · number_x 對於同一個 x 來說,其和為 number_x · ( sum ( 編號 ) - x ),先將其補上一個 number_x · x。那麼此時這部分和為 sum ( number ) · sum ( 編號 ),sum ( number ) 和 sum ( 編號 ) 都是可以預處理的。需要減去的 number_x · x 算在之前的 ( s - 1 ) · sum ( number_x · x ),於是變為 ( s - 2 ) · sum ( number_x · x )。

不過似乎少了 x · number_z,其實也被算在了 number_z · ( sum ( 編號 ) - z ) 中了,最後不要忘記開 long long 和取模哦。整個程式的時間複雜度是 O ( n + m ),可以接受的。