Description
In this task Anna and Maria play the following game. Initially they have a checkered piece of paper with a painted n × m rectangle (only the border, no filling). Anna and Maria move in turns and Anna starts. During each move one should paint inside the last-painted rectangle a new lesser rectangle (along the grid lines). The new rectangle should have no common points with the previous one. Note that when we paint a rectangle, we always paint only the border, the rectangles aren't filled.
Nobody wins the game — Anna and Maria simply play until they have done k moves in total. Count the number of different ways to play this game.
Input
The first and only line contains three integers: n, m, k (1 ≤ n, m, k ≤ 1000).
Output
Print the single number — the number of the ways to play the game. As this number can be very big, print the value modulo1000000007 (109 + 7).
Sample Input
3 3 1
1
4 4 1
9
6 7 2
75
Hint
Two ways to play the game are considered different if the final pictures are different. In other words, if one way contains a rectangle that is not contained in the other way.
In the first sample Anna, who performs her first and only move, has only one possible action plan — insert a 1 × 1 square inside the given3 × 3 square.
In the second sample Anna has as much as 9 variants: 4 ways to paint a 1 × 1 square, 2 ways to insert a 1 × 2 rectangle vertically, 2 more ways to insert it horizontally and one more way is to insert a 2 × 2 square.
横竖可以分开来看
对于长度为M的棍来说 取K次相当于C(m-1,2*k)
取k次需要2*k个点
而点不能包括短点 (长度为M有M+1个点)
代码:
#include<cstdio>
#include<cstring>
const int mod=1000000007;
long long ans[1010][1010];
int main()
{
int i,j;
ans[0][0]=1;
for(i=0;i<1010;i++)
{
ans[i][i]=ans[i][0]=1;
for(j=1;j<i;j++)
{
ans[i][j]=(ans[i-1][j-1]+ans[i-1][j])%mod;
}
}
int n,m,k;
printf("%d",sizeof(ans));
while(scanf("%d %d %d",&n,&m,&k)!=EOF)
{
printf("%lld\n",(ans[n-1][2*k]*ans[m-1][2*k])%mod);
}
return 0;
}