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^9 時 n(n+1) 約 10^{18},已經逼近 long long 的極限、更是 int 的一萬倍——先確定 n 是 long long 再相乘(上冊 2.9 的溢位,這裡最容易回鍋)。
再一個生活例:n 瓶飲料、每 d 瓶裝一箱,最後不足一箱的有幾瓶?模擬「一箱一箱扣」是 O(n / d),但數學課早就給過答案——餘數:
cout << n % d << '\n'; // 一步