首页 > 代码库 > codeforce 128C Games with Rectangle 排列组合
codeforce 128C Games with Rectangle 排列组合
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; }