計算 n^m mod 1000,輸出結果(無前導零)。多組測試,n=m=0 結束。n,m 為非負整數。
(a×b) mod p = ((a mod p) × (b mod p)) mod p
迭代 m 次:result = (result * (n%1000)) % 1000。時間 O(m)。
sum = 1;
for i=1..m: sum = ((n%1000) * sum) % 1000;
正確但 m 可能很大(如 10⁹),O(m) 會超時。需用 快速冪(二進制指數法) 優化至 O(log m)。
#include <stdio.h>
int mod_pow(int base, int exp, int mod) {
int result = 1 % mod;
base %= mod;
while (exp > 0) {
if (exp & 1) result = (result * base) % mod;
base = (base * base) % mod;
exp >>= 1;
}
return result;
}
int main() {
int n, m;
while (scanf("%d %d", &n, &m) == 2) {
if (n == 0 && m == 0) break;
printf("%d\n", mod_pow(n, m, 1000));
}
return 0;
}
m=10⁹ 僅需 ~30 次迴圈。result * base 最大 999*999 < 10⁶,int 安全。若模數較大需用 long long 或 __int128。m=0:n⁰=1(含 0⁰ 定義為 1,符合大多數編程約定)。若 gcd(n,1000)=1,由歐拉定理 n^φ(1000) ≡ 1 (mod 1000),φ(1000)=400。可將指數模 400 減少。但 1000=2³×5³ 非質數,且 n 可能不互質,通用性不如快速冪。