A hard puzzle(HDU1097)(快速幂取模)
生活随笔
收集整理的這篇文章主要介紹了
A hard puzzle(HDU1097)(快速幂取模)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接:
HDU1097
題面:
翻譯:
問題描述
lcy給了feng5166,lwg,JGShining和Ignatius一個難題:給了a和b,如何知道a^b。每個人都反對這個BT問題,所以lcy使這個問題比開始容易。
這個難題描述的是,給定a和b,如何知道a^b的最后一位數字。但每個人都太懶了,不想解決這個問題,所以他們把這個問題交給你這個智者。
輸入
有多個測試用例。每個測試用例由兩個數字a和b組成(0<a,b<=2^30)
輸出
對于每個測試用例,您應該輸出a^b的最后一位數字。
樣例輸入
7 66
8 800
樣例輸出
9
6
思路:
這道題目讓你求的其實就是a^b對10取模之和的結果是多少,然后我們這邊要引入兩個知識點,快速冪和快速冪取模
快速冪:
為快速求a^b,我們可以采用折半的思想:
1:當b為偶數時,a^b = = a^(b/2) * a^(b/2)
2:當b為奇數時,a^b = =a * (a^(b/2)) * (a^(b/2))
代碼塊:
int quick_mi(int a,int b) {int ans=1;while(b){if(b&1)//奇數隔單,位運算更快,其實還可以寫為,b%2==1{ans=ans*a;}a=a*a;//偶數折半b=b>>1;//位運算折半,其實還可以寫為b=b/2}return ans; }快速冪取模:
1:根據數學公式:a * b%m=(a%m)*(b%m)%m
代碼塊:
int quick_mi(int a,int b,int c) {int ans=1;while(b){if(b&1)//奇數隔單{ans=ans*a%c;}a=a*a%c;//偶數折半b=b>>1;}return ans; }當我們把這兩個知識點搞懂了的話,這道題目就相當簡單了,我們就只需要按照第二個快速冪取余的代碼來寫這題,這題目就能輕易AC了
參考代碼:
#include<iostream> using namespace std; int main() {long long a,b,ans,i;while(cin>>a>>b){long long ans=1;while(b){if(b&1){ans=(ans%10*a)%10;}a=(a%10*a%10)%10;b=b>>1;}cout<<ans<<endl;} }總結
以上是生活随笔為你收集整理的A hard puzzle(HDU1097)(快速幂取模)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: buck降压电路解析
- 下一篇: 服务器宕机 自动重启,服务器宕机重启利弊