給定 a, b,求 a^b 的最後一位數字(即 a^b mod 10)。多組測試,直到 EOF。
對於任意整數 a,其冪次末位數字隨指數增長呈現週期性,週期長度 ≤ 4。
預計算 a%10 的冪次末位序列,直到重複初值,即得循環節。
答案為 cycle[b % cycle_len](注意 b % cycle_len == 0 取最後一位)。
| 末位 | 循環節 | 長度 |
|---|---|---|
| 0 | 0 | 1 |
| 1 | 1 | 1 |
| 2 | 2,4,8,6 | 4 |
| 3 | 3,9,7,1 | 4 |
| 4 | 4,6 | 2 |
| 5 | 5 | 1 |
| 6 | 6 | 1 |
| 7 | 7,9,3,1 | 4 |
| 8 | 8,4,2,6 | 4 |
| 9 | 9,1 | 2 |
int main() {
long long a, b;
while (cin >> a >> b) {
a %= 10;
if (b == 0) { cout << 1 << endl; continue; } // a^0 = 1
int cycle[4], len = 0;
int cur = a;
do {
cycle[len++] = cur;
cur = (cur * a) % 10;
} while (cur != a);
cout << cycle[(b - 1) % len] << endl;
}
return 0;
}
b=0 特判:a^0 = 1(題目未明確但通常需處理)。do-while 確保至少一個元素。(b-1) % len 因序列從指數 1 開始。long long 讀取 b。int mod_pow(int a, long long b, int mod) {
int res = 1;
a %= mod;
while (b) {
if (b & 1) res = (res * a) % mod;
a = (a * a) % mod;
b >>= 1;
}
return res;
}
// 直接調用 mod_pow(a, b, 10) 即可,O(log b) 同樣極快。