【BZOJ 4766】文艺计算姬

  • Post author:
  • Post category:其他




【题目】


传送门


题目描述:

“奋战三星期,造台计算机”。小 W 响应号召,花了三星期造了台文艺计算姬。

文艺计算姬比普通计算机有更多的艺术细胞。 普通计算机能计算一个带标号完全图的生成树个数,而文艺计算姬能计算一个带标号完全二分图的生成树个数。

更具体地,给定一个一边点数为



n

n






n





,另一边点数为



m

m






m





,共有



n

m

n*m






n













m





条边的带标号完全二分图



k

n

,

m

k_{n,m}







k











n


,


m






















,计算姬能快速算出其生成树个数。

小 W 不知道计算姬算的对不对,你能帮助他吗?


输入格式:

仅一行三个整数



n

,

m

,

p

n,m,p






n


,




m


,




p





,表示给出的完全二分图



k

n

,

m

k_{n,m}







k











n


,


m























输出格式:

仅一行一个整数,表示完全二分图



k

n

,

m

k_{n,m}







k











n


,


m






















的生成树个数,答案需要模



p

p






p






样例数据:

输入


2 3 7

输出


5


备注:

【数据范围】

20% 的数据:



n

m

20

n*m ≤ 20






n













m













2


0






另有 10% 的数据:



n

=

2

n=2






n




=








2






另有 20% 的数据:



n

=

3

,

m

1

0

6

n=3 , m≤10^6






n




=








3


,




m













1



0










6













另有 20% 的数据:



n

=

4

n=4






n




=








4






100% 的数据:



1

n

,

m

,

p

1

0

18

1 ≤n,m,p ≤ 10^{18}






1













n


,




m


,




p













1



0











1


8














【分析】

直接说结论吧,最后的答案



a

n

s

=

m

n

1

n

m

1

  

m

o

d
  

p

ans=m^{n-1}\cdot n^{m-1} \;mod\;p






a


n


s




=









m











n





1






















n











m





1












m


o


d




p




当然,这个东西我是没有推出来的,我们老师直接给我们说了结论,让我们当成快速幂板子做

注意两个



l

o

n

g
  

l

o

n

g

long\;long






l


o


n


g




l


o


n


g





相乘很可能会爆



l

o

n

g
  

l

o

n

g

long\;long






l


o


n


g




l


o


n


g





的范围,我们要用

快速积

来防止爆精度



【代码】

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
long long n,m,p;
long long Multiply(long long a,long long b,long long c)
{
	long long ans=0,res=a;
	while(b)
	{
		if(b&1)
		  ans=(ans+res)%c;
		res=(res+res)%c;
		b>>=1;
	}
	return ans;
}
long long Power(long long a,long long b,long long c)
{
	long long ans=1,res=a;
	while(b)
	{
		if(b&1)
		  ans=Multiply(ans,res,c);
		res=Multiply(res,res,c);
		b>>=1;
	}
	return ans;
}
int main()
{
	scanf("%lld%lld%lld",&n,&m,&p);
	printf("%lld",Multiply(Power(n,m-1,p),Power(m,n-1,p),p));
	return 0;
}



版权声明:本文为forever_dreams原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。