const int MODE = 1000000;
int factorial = 1;
for (j = 1; j <= i; j++)
factorial = (factorial * j % MODE);
s = (s + factorial) % MODE;
MODE = 1,000,000 用於 **取模 (Modulo) 運算**,目的有二:
int 通常為 32 位元有號數,最大值約 21 億。階乘增長極快,13! = 6,227,020,800 已超過 INT_MAX,導致溢位產生負數或錯誤結果。每次乘法後取模,保證中間結果永遠在 [0, 999999] 範圍內,完全避免溢位。利用模運算性質:(a * b) % m = ((a % m) * (b % m)) % m。
每一步乘法後立即取模,等價於最終結果取模,但中間值永不超過 m^2 (此處 10^12),32 位元 long long 可安全容納;若用 int 需確保 m * m < INT_MAX,此處 10^12 > 2*10^9,**實際應宣告 long long factorial 才安全**,原碼若用 int 乘法前仍可能溢位。
const long long MODE = 1000000;
long long factorial = 1;
for (j = 1; j <= i; j++)
factorial = (factorial * j) % MODE; // 先乘後模,long long 保證不溢位
s = (s + factorial) % MODE;
取模 1000000 是為**防溢位且符合題目輸出要求**;實作時務必用 long long 儲存中間乘積,再取模存回。