bzoj4766 文艺计算姬(2017省选推广赛B)(含证明?)

4766: 文艺计算姬

Time Limit: 1 Sec   Memory Limit: 128 MB
Submit: 102   Solved: 63
[ Submit][ Status][ Discuss]

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





用基尔霍夫定理写个暴力出来,跑几组小数据(别取模呀不然怎么找规律)质因数分解一下发现答案是[n^(m-1)]*[m^(n-1)]

楼下评论区的小哥用基尔霍夫定理证出来真的好赞...

貌似prufer序列也能证,我试着证一下....有不严谨或不正确的地方请指出....:

考虑prufer序列的构造过程(参见prufer数列),最后剩下的未删除的两个点之间一定有练边(这个想一想就想通了),那么对于本题来说,考虑一棵合法生成树的prufer序列的生成过程,最后剩下的两个点既然有边,那一定属于二分图中不同的两个集合,即除这两个点外,每个点都被删除了一次。而删除时会将当时与被删除点有边的点加入prufer序列中,那根据二分图的性质(连边只在不同集合点之间),A集合中的点被加进prufer序列中m-1次,B集合中的点被加进n-1次,则生成树个数为[n^(m-1)]*[m^(n-1)],得证。

注意快速乘,1e18*1e18要炸呀


代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,m,p;
ll qc (ll a,ll b)
{
	ll ret=0,t=a;
	while(b)
	{
		if(b&1)ret=(ret+t)%p;
		t=(t+t)%p;b>>=1;
	}return ret%p;
}
ll qm(ll a,ll b)
{
	ll ret=1,t=a;
	while(b)
	{
		if(b&1)ret=qc(ret,t);
		t=qc(t,t);b>>=1;
	}return ret;
}
int main()
{
	scanf("%lld%lld%lld",&n,&m,&p);
	ll tmp=qm(n,m-1);
	ll txp=qm(m,n-1);
	printf("%lld\n",qc(tmp,txp));
}




  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值