題目鏈接:
http://acm.hdu.edu.cn/showproblem.php?pid=1061
題面:
翻譯:
問題描述
給定一個正整數N,你應該輸出N^N中最右邊的數字。
輸入
輸入包含幾個測試用例。輸入的第一行是一個整數T,它是測試用例的數量。接下來是T測試用例。
每個測試用例包含一個正整數N(1<=N<= 1000,000,000)。
輸出
對於每個測試用例,您應該輸出N^N的最右一位。
樣例輸入
2
3
4
樣例輸出
7
6
提示
在第一種情況下,3 * 3 * 3 = 27,所以最右邊的數字是7。
在第二種情況下,4 * 4 * 4 * 4 = 256,所以最右邊的數字是6。
思路:
這道題目是要求n的n次方的最後一位,我們可以仔細想想,最後一位是不是始終只因爲最後一位的相乘和發生改變,其他位數的數字相乘並不會改變最後一位的數字的數值,所有我們是不是只需要把最後一位相乘的結果取模10就可以得到最後的結果,那這道題目就要轉變爲一個取模的題目,都是這道題目的題目數據給的特別大,我們就需要使用快速冪來優化,所以這道題目就是一個簡單的快速冪的題目,我們求n的n次方的最後一位,我們只需要每次相乘的取模10,就可以得到最後一位,然後在最後一位相乘再取模10,最後得到的結果也是n的n次方的最後一位。
參考代碼:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<vector>
#include<list>
#include<stacK>
#include<queue>
#include<map>
#include<set>
using namespace std;
typedef long long ll;
ll fastPow(ll a,ll n)
{
ll base=a;
ll res=1;
while(n)
{
if(n&1)
res=(res*base)%10;
base=(base*base)%10;
n>>=1;
}
return res;
}
int main()
{
ll t;
cin>>t;
while(t--)
{
ll n,ans;
cin>>n;
ans=fastPow(n,n);
cout<<ans<<endl;
}
}