語法書 / AA 競程語法書 下冊 / 第十七單元 / 用數學性質優化:一步到位的公式

17.2 用數學性質優化:一步到位的公式

最徹底的優化,是根本不跑迴圈。開場高斯的配對法,寫成一般式就是等差級數公式:

1 + 2 + \cdots + n = \frac{n(n+1)}{2}

拿「輸入 n,輸出 1 加到 n 的總和(n \le 10^9)」來對照:

// 做法一:迴圈累加——O(n),n = 10^9 就是十億次,約一秒起跳
long long sum = 0;
for (long long i = 1; i <= n; i++) {
    sum += i;
}

// 做法二:公式——O(1),一步
long long sum = n * (n + 1) / 2;

用公式時型態要跟上:n = 10^9n(n+1)10^{18},已經逼近 long long 的極限、更是 int 的一萬倍——先確定 nlong long 再相乘(上冊 2.9 的溢位,這裡最容易回鍋)。

再一個生活例:n 瓶飲料、每 d 瓶裝一箱,最後不足一箱的有幾瓶?模擬「一箱一箱扣」是 O(n / d),但數學課早就給過答案——餘數

cout << n % d << '\n';    // 一步