zoukankan      html  css  js  c++  java
  • 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@
  • 相关阅读:
    Python 的 IDLE 编辑器
    Android中如何在Eclipse中关联源代码?(图文)
    HTMl5的存储方式sessionStorage和localStorage详解
    HTML的 <u> 标签
    CSS巧妙实现分隔线的几种方法
    关于ajax跨域请求(cross Domain)
    JQuery中$.ajax()方法参数都有哪些?
    最优雅,高效的javascript字符串拼接
    深入学习JavaScript: apply 方法 详解(转)——非常好
    jQuery.ajax() 函数详解
  • 原文地址:https://www.cnblogs.com/zzuli2sjy/p/5444636.html
Copyright © 2011-2022 走看看