MITE4 論如何科學求冪

2021-09-14 00:59:50 字數 1073 閱讀 5296

快就完事了,acm最速傳說!

從初中開始,我們就知道a^b這個叫做a的b次冪(但是我直到高中才接受這個說法

對於求冪,大家肯定就想到pow(a,b)這個math.h裡有的函式,但是這個函式是浮點型的,會有誤差。

詳見[c/c++]c語言中math.h和cmath的pow()精度問題

但是問題不大,自己寫乙個整數的pow有多難呢是吧

ll pow(ll a,int b,ll p )

}

原理也很簡單比如 

2^18=(2^2)^9=4^9=4^8*4=(4^2)^4*4=16^4*4=(16^2)^2*4=256^2*4=65536*4=262144

複雜度為o(logn)

好了,這個方法其實以及足夠快了。但是要注意一些細節,就是如果p很大,a*ret和a*a可能會溢位。

於是又有了快速乘法····(其實一點都不快),它可以避免溢位(只要p不要大的離譜,比如說1e18,但對那麼大的數取模有個屁意義,不過1e18其實也是可以避免溢位的···所以無視括號裡這段廢話吧),有時也可以判斷溢位。

ll qmul(ll a,ll b,ll p)

return ret;

}

然後,ll範圍裡的冪運算我們基本都能解決了,但是,如果有ll範圍外的冪運算呢

比如 a<1e6 b<1e1000 p<1e5這種範圍的題呢?可能有人會想高精度除法什麼的,那個也不是不行,但又更好的方法

那就是尤拉降冪

講到尤拉降冪肯定要說到尤拉函式和尤拉定理了,但是那個我遲點開乙個部落格專門說吧,這裡就直接給出公式和**就算了。

a^b mod p = a^(b mod phi(p)+phi(p)) mod p   phi()是尤拉函式

ll phi(ll x)

if(a>1)

res = res/a*(a-1);

return res;

}int main()

收藏 mvm的「公司如船」大論

mvm的 有個企業家被問到他為什麼喜歡航海。他的回答是,航海和經營企業有強烈的共同點 到了海上以後,就算船上有人你不喜歡,你也只能去適應他,而不可能把他丟到海浬去。深有同感。去年秋天還沒降溫的時候,和幾個朋友吃飯,說到我帶的乙個vendor,當時覺得他很多地方sense不夠,活也不讓人滿意。朋友問我...

收藏 mvm的「公司如船」大論

mvm的 有個企業家被問到他為什麼喜歡航海。他的回答是,航海和經營企業有強烈的共同點 到了海上以後,就算船上有人你不喜歡,你也只能去適應他,而不可能把他丟到海浬去。深有同感。去年秋天還沒降溫的時候,和幾個朋友吃飯,說到我帶的乙個vendor,當時覺得他很多地方sense不夠,活也不讓人滿意。朋友問我...

收藏 mvm的「公司如船」大論

mvm的 有個企業家被問到他為什麼喜歡航海。他的回答是,航海和經營企業有強烈的共同點 到了海上以後,就算船上有人你不喜歡,你也只能去適應他,而不可能把他丟到海浬去。深有同感。去年秋天還沒降溫的時候,和幾個朋友吃飯,說到我帶的乙個vendor,當時覺得他很多地方sense不夠,活也不讓人滿意。朋友問我...