Rightmost Digit(HDU 1061 快速冪取模)

題目鏈接:

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;
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章