题解
我们先从小的开始,即从 2 2 2 个点开始考虑:那么两个点之间 x x x 的贡献就是 ∣ x 1 − x 2 ∣ | x_1-x_2 | ∣x1−x2∣,设 d d d 为这个数,那么每行就有 ( n − d ) (n-d) (n−d) 个,也就是整个图有 ( n − d ) × m 2 (n-d) \times m^2 (n−d)×m2 个,贡献也就是 ( n − d ) × m 2 × d (n-d)\times m^2\times d (n−d)×m2×d 个;两个点之间 y y y 的贡献就是 ∣ y 1 − y 2 ∣ |y_1-y_2| ∣y1−y2∣,也是设这个数为 d d d,那么每列就有 ( m − d ) (m-d) (m−d) 个,整个图就有 ( m − d ) × n 2 (m-d) \times n^2 (m−d)×n2 个,贡献也就是 ( m − d ) × n 2 × d (m-d)\times n^2\times d (m−d)×n2×d。
求出了两个点的对整个图的贡献,就下来就要考虑重复的情况了,即:
C
n
×
m
−
2
k
−
2
C_{n\times m-2}^{k-2}
Cn×m−2k−2
后面求出来这个数就可以直接乘上它就能求出贡献!
但是,又有一个问题:除数太大了!!!这时候逆元就登场了!
逆元
取模的规律如下:
- ( a + b ) m o d p = ( a m o d p + b m o d p ) m o d p (a+b)\bmod p=(a\bmod p+b\bmod p)\bmod p (a+b)modp=(amodp+bmodp)modp
- ( a − b ) m o d p = ( a m o d p − b m o d p ) m o d p (a-b)\bmod p=(a\bmod p-b\bmod p)\bmod p (a−b)modp=(amodp−bmodp)modp
- ( a × b ) m o d p = ( a m o d p × b m o d p ) m o d p (a\times b)\bmod p=(a\bmod p\times b\bmod p)\bmod p (a×b)modp=(amodp×bmodp)modp
那么除法怎么办呢?
这时要想到他的逆元了:
根据费马小定理,可得出:
a
b
m
o
d
p
=
(
a
×
b
p
−
2
)
m
o
d
p
\frac{a}{b}\bmod{p}=(a\times b^{p-2})\bmod{p}
bamodp=(a×bp−2)modp。
所以在逆元下,用个快速幂就能轻松搞定这一个题。
Code
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll mod=1000000007;
ll n,m,k,ans=0;
ll qpow(ll a,ll b){
ll sum = 1;
while(b){
if(b & 1) sum = (sum * a) % mod;
a = (a * a) % mod;
b >>= 1;
}
return sum % mod;
}
ll C(ll a,ll b){//C(n,m)=C(n*m-2,k-2)
if(a==b||b==0) return 1;
if(a<b) return 0;
ll fz=1;
for(ll i=1;i<=a;i++)fz*=i,fz%=mod;
ll fm=1;
for(ll i=1;i<=b;i++)fm*=i,fm%=mod;
ll other=1;
for(ll i=1;i<=a-b;i++)other*=i,other%=mod;
fm=(fm*other)%mod;
fm=qpow(fm,mod-2)%mod;
return (fz*fm)%mod;
}
int main(){//
cin>>n>>m>>k;
for(ll i=1;i<n;i++)
ans += ((n-i)*i*m*m)%mod;
for(ll j=1;j<m;j++)
ans += ((m-j)*j*n*n)%mod;
ans %= mod;
ans=(ans*C(n*m-2,k-2))%mod;
cout<<ans;
return 0;
}