1246 - Colorful Board

1246 - Colorful Board
Time Limit: 2 second(s) Memory Limit: 32 MB

You are given a rectangular board. You are asked to draw M horizontal lines and N vertical lines in that board, so that the whole board will be divided into (M+1) x (N+1) cells. So, there will be M+1 rows each of which will exactly contain N+1 cells or columns. The yth cell of xth row can be called as cell(x, y). The distance between two cells is the summation of row difference and column difference of those two cells. So, the distance between cell(x1, y1) and cell(x2, y2) is

|x1 - x2| + |y1 - y2|

For example, the distance between cell (2, 3) and cell (3, 2) is |2 - 3| + |3 - 2| = 1 + 1 = 2.

After that you have to color every cell of the board. For that you are given K different colors. To make the board more beautiful you have to make sure that no two cells having the same color can have odd distance between them. For example, if you color cell (3, 5) with red, you cannot color cell (5, 8) with red, as the distance between them is 5, which is odd. Note that you can keep some color unused, but you can't keep some cell uncolored.

You have to determine how many ways to color the board using those K colors.

Input

Input starts with an integer T (≤ 20000), denoting the number of test cases.

Each case starts with a line containing three integers M, N, K (0 ≤ M, N ≤ 19, 1 ≤ K ≤ 50).

Output

For each case, print the case number and the number of ways you can color the board. The result can be large, so print the result modulo 1000000007.

Sample Input

Output for Sample Input

4

0 0 1

0 0 2

5 5 2

5 5 1

Case 1: 1

Case 2: 2

Case 3: 2

Case 4: 0

 


PROBLEM SETTER: MD. ARIFUZZAMAN ARIF
SPECIAL THANKS: JANE ALAM JAN
1246 - Colorful Board
Time Limit: 2 second(s) Memory Limit: 32 MB

You are given a rectangular board. You are asked to draw M horizontal lines and N vertical lines in that board, so that the whole board will be divided into (M+1) x (N+1) cells. So, there will be M+1 rows each of which will exactly contain N+1 cells or columns. The yth cell of xth row can be called as cell(x, y). The distance between two cells is the summation of row difference and column difference of those two cells. So, the distance between cell(x1, y1) and cell(x2, y2) is

|x1 - x2| + |y1 - y2|

For example, the distance between cell (2, 3) and cell (3, 2) is |2 - 3| + |3 - 2| = 1 + 1 = 2.

After that you have to color every cell of the board. For that you are given K different colors. To make the board more beautiful you have to make sure that no two cells having the same color can have odd distance between them. For example, if you color cell (3, 5) with red, you cannot color cell (5, 8) with red, as the distance between them is 5, which is odd. Note that you can keep some color unused, but you can't keep some cell uncolored.

You have to determine how many ways to color the board using those K colors.

Input

Input starts with an integer T (≤ 20000), denoting the number of test cases.

Each case starts with a line containing three integers M, N, K (0 ≤ M, N ≤ 19, 1 ≤ K ≤ 50).

Output

For each case, print the case number and the number of ways you can color the board. The result can be large, so print the result modulo 1000000007.

Sample Input

Output for Sample Input

4

0 0 1

0 0 2

5 5 2

5 5 1

Case 1: 1

Case 2: 2

Case 3: 2

Case 4: 0

 


PROBLEM SETTER: MD. ARIFUZZAMAN ARIF
SPECIAL THANKS: JANE ALAM JAN
思路:格子可以分成两类,就像棋格一样
那么我们只要看下黑色的棋格放的情况,来决定白色格放的颜色,也就是在黑色格中没填的颜色,假如是x,黑格数是k,那么黑格放的种数就是xk;那么在乘以白格的方案数就行。
那么我们需要讨论,白格中有多少种颜色,以及它的种数,白格数是y的话,我们要求的是,当有i种颜色时的方案数,那么这就转换成,将y个东西放入i个盒子的不同方案数。
那么就是求strlin(y,i)*(i!);
 1 #include<stdio.h>
 2 #include<algorithm>
 3 #include<string.h>
 4 #include<iostream>
 5 using namespace std;
 6 typedef long long LL;
 7 const LL N= 1000000007;
 8 LL yan[1005][1005];
 9 LL STL[1005][1005];
10 LL pp[1005];
11 LL quick(LL n,LL m);
12 int main(void)
13 {
14         int i,j,k;
15         scanf("%d",&k);
16         int s;
17         yan[0][0]=1;
18         for(i=1; i<=1000; i++)
19         {
20                 for(j=0; j<=i; j++)
21                 {
22                         if(j==0||i==j)
23                                 yan[i][j]=1;
24                         else
25                         {
26                                 yan[i][j]=(yan[i-1][j]+yan[i-1][j-1])%N;
27                         }
28                 }
29         }
30         pp[0]=1;
31         for(i=1;i<=1000;i++)
32             pp[i]=(pp[i-1]*i)%N;
33         memset(STL,0,sizeof(STL));
34         STL[0][0]=1;
35         STL[1][0]=0;
36         STL[1][1]=1;
37         for(i=2; i<=1000; i++)
38         {
39                 for(j=1; j<=i; j++)
40                 {
41                         if(j==1||i==j)
42                                 STL[i][j]=1;
43                         else
44                         {
45                                 STL[i][j]=((STL[i-1][j]*j)%N+STL[i-1][j-1])%N;
46                         }
47                 }
48         }
49         for(s=1; s<=k; s++)
50         {
51                 int x1,x2,x3,x4;
52                 scanf("%d %d %d",&x1,&x2,&x3);
53                 x1+=1;
54                 x2+=1;
55                 LL sum=(x1*x2);
56                 LL he=(sum+1)/2;
57                 LL cnt=0;
58                 for(i=1; i<=min((LL)x3,he); i++)
59                 {
60                         LL  x=x3-i;
61                         LL kk=quick(x,sum-he);
62                         LL ak=((STL[he][i]*yan[x3][i]%N)*kk)%N;
63                         cnt=(cnt+ak*pp[i]%N)%N;
64                 }
65                 printf("Case %d: ",s);
66                 printf("%lld\n",cnt);
67         }
68         return 0;
69 }
70 
71 LL quick(LL n,LL m)
72 {
73         LL ans=1;n%=N;
74         while(m)
75         {
76                 if(m&1)
77                         ans=(ans*n)%N;
78                 n=(n*n)%N;
79                 m/=2;
80         }
81         return  ans;
82 }

 

posted @ 2016-04-28 22:46  sCjTyC  阅读(189)  评论(0编辑  收藏  举报