Bzoj4766 文艺计算姬

 

Time Limit: 1 Sec  Memory Limit: 128 MB

Submit: 234  Solved: 142

Description

"奋战三星期,造台计算机"。小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 }

 

posted @ 2017-03-09 11:13  SilverNebula  阅读(348)  评论(0编辑  收藏  举报
AmazingCounters.com