快就完事了,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不夠,活也不讓人滿意。朋友問我...