Rightmost DigitCrawling in process...Crawling failedTime Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u
Description
Given a positive integer N, you should output the most right digit of N^N.
Input
The input contains several test cases. The first line of the input is a single integer T which is the number of test cases. T test cases follow.
Each test case contains a single positive integer N(1<=N<=1,000,000,000).
Each test case contains a single positive integer N(1<=N<=1,000,000,000).
Output
For each test case, you should output the rightmost digit of N^N.
Sample Input
2 3 4
Sample Output
7 6
Hint
In 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的个位数
思路:这是典型的幂取模的应用;
对于a^n%m来说 一般的做法是
int pow(int a,int n,int m)
{
int ans=1;
for(int i=0;i<n;i++)
ans=(int)((long long)ans*n%m);
}
时间复杂度为O(n),当n很大的时候速度就很不理想。下面这种算法就能很大的提高速度:
利用分治法
int pow_mod(int a,int n,int m) { int x=pow_mod(a,n/2,m); long long ans=(long long)x*x%m; if(n%2==1) ans=ans*a%m; return (int)ans; } 例如a^29=(a^14)^2*a----->a^14=(a^7)^2----->a^7=(a^3)^2*a----->a^3=a^2*a; 一共只做了七次乘法,近似二分查找,每次规模减少近一半,时间复杂度为O(log n);
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <map> #include <string> #include <algorithm> #include <iostream> #include <queue> using namespace std; int pow_mod(int a,int n,int m) { int ans= 1; while (n > 0) { if (n%2==1) { ans=ans*a%m; } a*=a; a%=m; n/=2; } return ans; } int main() { int T; int n,t; scanf("%d", &T); while(T--) { scanf("%d", &n); t=pow_mod(n%10,n,10); printf("%d\n", t); } return 0; }