Description

Solution

n = h + w n=h+w n=h+w

1. O ( n 2 ) 1.O(n^2) 1.O(n2)

枚举行数 i i i和列数 j j j
P h i P_h^i Phi代表 h h h行里选了 i i i行的排列(与顺序无关,所以是排列)
P w j P_w^j Pwj同理
但是两个排列只枚举了行与行和列与列之间的先后顺序,还不知道整个的先后顺序,那么再乘上一个 C i + j i C_{i+j}^i Ci+ji就得到了整个的方案数
( i + 1 ) ( j + 1 ) (i+1)(j+1) (i+1)(j+1)为此时的贡献
很多人会以为这样就好了,但事实上因为过程中的答案统计的不一定只有一次,所以每个方案要乘上它接下来的方案个数 P n i j k i j P_{n-i-j}^{k-i-j} Pnijkij i + j i+j i+j表示当前总操作次数, k i j k-i-j kij为剩下的操作次数),配张图:

这张图代表了答案的计算过程
我们发现 1 , 2 , 3 1,2,3 1,2,3这三个点都经过了 2 2 2次,要把这个东西统计进去
a n s = <munderover> i = 0 h </munderover> <munderover> j = 0 w </munderover> P h i P w j C i + j i ( i + 1 ) ( j + 1 ) P n i j k i j ans=\sum_{i=0}^h\sum_{j=0}^wP_h^iP_w^jC_{i+j}^i(i+1)(j+1)P_{n-i-j}^{k-i-j} ans=i=0hj=0wPhiPwjCi+ji(i+1)(j+1)Pnijkij

2. O ( n l o g n ) 2.O(nlogn) 2.O(nlogn)

把上式的 a n s ans ans拆开来,得到:
a n s = h ! w ! ( n i j ) ! ( i + j ) ! ( i + 1 ) ( j + 1 ) i ! j ! ( h i ) ! ( w j ) ! n ! ans=\frac{h!w!(n-i-j)!(i+j)!(i+1)(j+1)}{i!j!(h-i)!(w-j)!n!} ans=i!j!(hi)!(wj)!n!h!w!(nij)!(i+j)!(i+1)(j+1)
这东西可以用 F F T FFT FFT优化

3. O ( l o g n ) 3.O(logn) 3.O(logn)

考虑到我们要统计矩形的个数,那么只要统计左下角同时被行列两条线经过(边界的点默认已经被边界线经过)的个数即可
那么,在计算第 i i i次分割的时候,不在边界上的点有 C i 2 C n 2 \frac{C_i^2}{C_n^2} Cn2Ci2的概率被两条线切到(每次分割都会选怎么切,切到的两个数同时 i ≤i i的个数为 C i 2 C_i^2 Ci2个,而切到数 n ≤n n的个数为 C n 2 C_n^2 Cn2,所以概率为 C i 2 C n 2 \frac{C_i^2}{C_n^2} Cn2Ci2
而这样的点有 h w hw hw个,所以总数为 ( k 1 ) k ( k + 1 ) h w 3 n ( n 1 ) \frac{(k-1)k(k+1)hw}{3n(n-1)} 3n(n1)(k1)k(k+1)hw
对于在边界上,但不是左下角的点,概率为 i n \frac{i}{n} ni总共 n n n个,总数为 k ( k + 1 ) 2 \frac{k(k+1)}{2} 2k(k+1)
左下角那个点每次概率为 1 1 1 k k k次后,总数为 k k k
所以: a n s = ( k 1 ) k ( k + 1 ) h w 3 n ( n 1 ) + k ( k + 1 ) 2 + k ans=\frac{(k-1)k(k+1)hw}{3n(n-1)}+\frac{k(k+1)}{2}+k ans=3n(n1)(k1)k(k+1)hw+2k(k+1)+k

Code

过程中有 0 0 0的话要特判掉

#include<bits/stdc++.h>
using namespace std;
const int M=1e9+7;
long long h,w,k;
int n;
int pw(int x,int y){
	int z=1;
	for (;y;y>>=1,x=1ll*x*x%M)
		if (y&1) z=1ll*z*x%M;
	return z;
}
int main(){
	scanf("%lld%lld%lld",&h,&w,&k);
	h%=M,w%=M,k%=M,n=(h+w)%M;
	printf("%lld",(1ll*k*(k+1)%M*(k-1)%M*((M+1)/3)%M*(h?h:1)%M*(w?w:1)%M*(n==1?1:pw(1ll*n*(n-1)%M,M-2))+1ll*k*(k+1)/2+k)%M);
}