Bzoj4766 文艺计算姬
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 234 Solved: 142Description
"奋战三星期,造台计算机"。小W响应号召,花了三星期造了台文艺计算姬。文艺计算姬比普通计算机有更多的艺
术细胞。普通计算机能计算一个带标号完全图的生成树个数,而文艺计算姬能计算一个带标号完全二分图的生成树
个数。更具体地,给定一个一边点数为n,另一边点数为m,共有n*m条边的带标号完全二分图K_{n,m},计算姬能快
速算出其生成树个数。小W不知道计算姬算的对不对,你能帮助他吗?
Input
仅一行三个整数n,m,p,表示给出的完全二分图K_{n,m}
1 <= n,m,p <= 10^18
Output
仅一行一个整数,表示完全二分图K_{n,m}的生成树个数,答案需要模p。
Sample Input
2 3 7
Sample Output
5
HINT
Source
矩阵树定理 快速乘
用Matrix-Tree打个小表,找找规律
发现答案等于n^(m-1) * m^(n-1) ←怎么发现的啊
然后快速幂愉快地炸了。
发现还有种神奇的算法叫快速乘↓
1 /*by SilverN*/ 2 #include<algorithm> 3 #include<iostream> 4 #include<cstring> 5 #include<cstdio> 6 #include<cmath> 7 #include<vector> 8 #define LL long long 9 using namespace std; 10 const int mxn=100010; 11 LL read(){ 12 LL x=0,f=1;char ch=getchar(); 13 while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();} 14 while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();} 15 return x*f; 16 } 17 LL n,m,p; 18 LL ksmul(LL a,LL b){ 19 LL res=0; 20 a%=p;b%=p; 21 while(b){ 22 if(b&1){ 23 res=(res+a); 24 if(res>p)res-=p; 25 } 26 a=(a<<1)%p; 27 b>>=1; 28 } 29 return res; 30 } 31 LL ksm(LL x,LL k){ 32 LL res=1; 33 while(k){ 34 if(k&1)res=ksmul(res,x)%p; 35 x=ksmul(x,x)%p; 36 k>>=1; 37 } 38 return res; 39 } 40 int main(){ 41 n=read();m=read();p=read(); 42 LL ans=ksmul(ksm(n,m-1),ksm(m,n-1))%p; 43 printf("%lld\n",ans); 44 return 0; 45 }
本文为博主原创文章,转载请注明出处。