链接:http://acm.hdu.edu.cn/showproblem.php?pid=1061
2 3 4
7 6HintIn the first case, 3 * 3 * 3 = 27, so the rightmost digit is 7. In the second case, 4 * 4 * 4 * 4 = 256, so the rightmost digit is 6.
大意——给你一个正整数n,要你算出n^n的最后一位数码。其中1<=n<=1,000,000,000。
思路——与HDU 1097差不多,我们可以用二分求快速幂,并且边乘边模,这样的话就不会出问题了。
复杂度分析——时间复杂度:O(log(n)),空间复杂度:O(1)
附上AC代码:
#include <iostream> #include <cstdio> #include <string> #include <cmath> #include <iomanip> #include <ctime> #include <climits> #include <cstdlib> #include <cstring> #include <algorithm> #include <queue> #include <vector> #include <set> #include <map> using namespace std; typedef unsigned int UI; typedef long long LL; typedef unsigned long long ULL; typedef long double LD; const double pi = acos(-1.0); const double e = exp(1.0); const double eps = 1e-8; const int mod = 10; int quick_pow(int a); int main() { ios::sync_with_stdio(false); int T, a; scanf("%d", &T); while (T--) { scanf("%d", &a); printf("%d\n", quick_pow(a)); } return 0; } int quick_pow(int a) { int res = 1; int b = a; while (b > 0) { if (b & 1) res = ((res%mod)*(a%mod))%mod; a = ((a%mod)*(a%mod))%mod; b >>= 1; } return res; }