• 1246


    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
    ",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 }
    油!油!you@
  • 相关阅读:
    关于MySQL INT类型长度的疑惑
    uwp 的锁屏功能
    QT5 动态链接库的创建和使用
    Qt 自定义事件的实现
    学习k8s本地虚拟机安装minikube
    建议收藏!细说HashMap实现,Hash冲突模拟思路讲解。
    95. Unique Binary Search Trees II
    96. Unique Binary Search Trees(dp)
    574 React系列(一)
    如何在Win7电脑上增加新磁盘分区?
  • 原文地址:https://www.cnblogs.com/zzuli2sjy/p/5444636.html
Copyright © 2020-2023  润新知