A hard puzzle(HDU1097)(快速幂取模)
題目鏈接:
HDU1097
題面:
翻譯:
問(wèn)題描述
lcy給了feng5166,lwg,JGShining和Ignatius一個(gè)難題:給了a和b,如何知道a^b。每個(gè)人都反對(duì)這個(gè)BT問(wèn)題,所以lcy使這個(gè)問(wèn)題比開(kāi)始容易。
這個(gè)難題描述的是,給定a和b,如何知道a^b的最后一位數(shù)字。但每個(gè)人都太懶了,不想解決這個(gè)問(wèn)題,所以他們把這個(gè)問(wèn)題交給你這個(gè)智者。
輸入
有多個(gè)測(cè)試用例。每個(gè)測(cè)試用例由兩個(gè)數(shù)字a和b組成(0<a,b<=2^30)
輸出
對(duì)于每個(gè)測(cè)試用例,您應(yīng)該輸出a^b的最后一位數(shù)字。
樣例輸入
7 66
8 800
樣例輸出
9
6
思路:
這道題目讓你求的其實(shí)就是a^b對(duì)10取模之和的結(jié)果是多少,然后我們這邊要引入兩個(gè)知識(shí)點(diǎn),快速冪和快速冪取模
快速冪:
為快速求a^b,我們可以采用折半的思想:
1:當(dāng)b為偶數(shù)時(shí),a^b = = a^(b/2) * a^(b/2)
2:當(dāng)b為奇數(shù)時(shí),a^b = =a * (a^(b/2)) * (a^(b/2))
代碼塊:
int quick_mi(int a,int b) {int ans=1;while(b){if(b&1)//奇數(shù)隔單,位運(yùn)算更快,其實(shí)還可以寫(xiě)為,b%2==1{ans=ans*a;}a=a*a;//偶數(shù)折半b=b>>1;//位運(yùn)算折半,其實(shí)還可以寫(xiě)為b=b/2}return ans; }快速冪取模:
1:根據(jù)數(shù)學(xué)公式: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)//奇數(shù)隔單{ans=ans*a%c;}a=a*a%c;//偶數(shù)折半b=b>>1;}return ans; }當(dāng)我們把這兩個(gè)知識(shí)點(diǎn)搞懂了的話,這道題目就相當(dāng)簡(jiǎn)單了,我們就只需要按照第二個(gè)快速冪取余的代碼來(lái)寫(xiě)這題,這題目就能輕易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;} }總結(jié)
以上是生活随笔為你收集整理的A hard puzzle(HDU1097)(快速幂取模)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: buck降压电路解析
- 下一篇: 服务器宕机 自动重启,服务器宕机重启利弊