1015 - 結論題&快速冪&快速乘 - 文藝計算姬(BZOJ 4766)
阿新 • • 發佈:2018-11-10
閒話
這這這這……直接上結論吧
生成樹的個數
可以用矩陣樹定理來推,但我不會啊……
dzyo大佬說我肯定看不懂…………那就算了吧,反正網上也沒給證明
但是最最重要的是:凱爺證出來了的!!!(凱爺(wuvin)好強啊)
分析
知道結論過後,我們本應直接使用快速冪
但由於資料範圍太大,直接1e18*1e18肯定會炸,所以我們還要用一下快速積,邊乘邊取模
快速積和快速冪的思想一模一樣
而且今天突然腦子好使,發現可以這樣來理解快速積
我們假設 現在要 求2*5
將5用二進位制表示出來
得到:
然後展開就可以得到快速乘了
dzyo皮了一下,用了O(1)快速乘,想了解的自己去百度吧,反正考試不能用
程式碼
#include<bits/stdc++.h> #define ll long long using namespace std; ll n,m,p; ll multiply(ll a,ll b){ ll res=0; while(b){ if(b&1) res=(res+a)%p; a=(a+a)%p; b>>=1; } return res; } ll quick_power(ll a,ll b){ ll res=1; while(b){ if(b&1) res=multiply(res,a); a=multiply(a,a); b>>=1; } return res; } int main(){ scanf("%lld%lld%lld",&n,&m,&p); ll a=quick_power(n,m-1),b=quick_power(m,n-1); printf("%lld",multiply(a,b)); return 0; }