1. 程式人生 > >1015 - 結論題&快速冪&快速乘 - 文藝計算姬(BZOJ 4766)

1015 - 結論題&快速冪&快速乘 - 文藝計算姬(BZOJ 4766)

傳送門

 

閒話

這這這這……直接上結論吧

生成樹的個數 n^{m-1}*m^{n-1}

 可以用矩陣樹定理來推,但我不會啊……

dzyo大佬說我肯定看不懂…………那就算了吧,反正網上也沒給證明

但是最最重要的是:凱爺證出來了的!!!(凱爺(wuvin)好強啊)

 

分析

知道結論過後,我們本應直接使用快速冪

但由於資料範圍太大,直接1e18*1e18肯定會炸,所以我們還要用一下快速積,邊乘邊取模

快速積和快速冪的思想一模一樣

而且今天突然腦子好使,發現可以這樣來理解快速積

我們假設 現在要  求2*5

將5用二進位制表示出來

得到: 2*(1*2^{0}+0*2^{1}+1*2^{2})

然後展開就可以得到快速乘了

 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;
}