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 |
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 |
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 }