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@
  • 相关阅读:
    Ajax 学习笔记
    StringBulider简单用法
    asp.net 发送邮件
    log4net日志组件
    Web.Config文件详解
    关闭discuzX3.2注册页面的注册邮箱验证
    Oracle 序列(sequence)的创建、修改及删除
    MySQL 和 Oracle 主键自增长
    EL(表达式)语言的几种运算符
    SQL:select case when 的用法
  • 原文地址:https://www.cnblogs.com/zzuli2sjy/p/5444636.html
Copyright © 2011-2022 走看看