【做題筆記】UVA10162 Last Digit
阿新 • • 發佈:2021-08-13
UVA10162
的形式。題目求最後一位,其實就是對 \(10\) 取模。
那麼: \[k^k=(100a+b)^{100a+b} \equiv b^{100a+b} \pmod{10} \] 。
又因為是在模 \(10\) 意義下,也就是取個位,所以 \(k^k \equiv d^d \equiv b^b \pmod{10}\)。
Problem
題目大意:
求 \(1^1+2^2+3^3+\cdots+n^n\) 的最後一位。其中 \(1 \le n \le 2 \times 10^{100}\)。
Solution
其實是個簡單的找規律題 QwQ。
我們不妨設 \(S(k)=\sum\limits_{i=1}^k i^i\)。那麼答案就是 \(S(n)\)。
先給出結論:\(S(k)=S(k \bmod 100)\)。
首先,我們可以通過打表或在 uDebug 上輸資料發現,\(S(100)=0\)。
然後,對於每一個大於 \(100\) 的數 \(k\),我們可以將其表示為 \(100a+b\)
那麼: \[k^k=(100a+b)^{100a+b} \equiv b^{100a+b} \pmod{10} \]
同樣的道理,我們也可以對 \(b\) 拆解,設 \(b=10c+d\),那麼:
\[b^{100a+b} \equiv b^{(100a+b) \bmod 4 + 4} \equiv (10c+d)^{d+4} \equiv d^{d+4} \pmod{10} \]我們可以列舉以下 \(d=0,1,2,\cdots,9\) 時 \(d^{d+4} \bmod 10\) 的情況,發現結果與 \(d^d \bmod 10\) 時的結果正好相等。
所以 \(k^k \equiv d^d \pmod{10}\)
又因為是在模 \(10\) 意義下,也就是取個位,所以 \(k^k \equiv d^d \equiv b^b \pmod{10}\)。
所以我們只要預處理出 \(S(0),S(1),S(2),\cdots,S(99)\),然後對於每次讀入取末兩位即可。
Code
#include<cstdio> #include<string> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int a[100]; string n; int power(int a,int b) { int ans=1; while(b) { if(b&1) ans=ans*a%10; a=a*a%10; b>>=1; } return ans%10; } int main() { for(int i=1;i<100;i++) a[i]=(a[i-1]+power(i,i))%10; while(cin>>n&&n!="0") if(n.length()<2) printf("%d\n",a[(n[0]-'0')]); else printf("%d\n",a[(n[n.length()-2]-'0')*10+n[n.length()-1]-'0']); return 0; }