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@
  • 相关阅读:
    【WPF】绘制柱状图、折线图、扇形图
    【WPF】获取容器宽高
    【SQL】SQL Server、MySQL、SQLite获取自增ID、自增ID清零
    【SQL Server操作】SQL Server重命名数据库及解决数据库无法分离的问题
    【数据迁移】MySQL数据库迁移到SQL Server
    【MySQL操作】MySQL导入导出数据库
    【MySQL操作】MySQL Workbench远程连接的一些操作
    【c#】遍历获得一个类的所有属性名
    vue 跨域 springCloud @CrossOrigin注解
    解决IDEA右侧maven不显示方法
  • 原文地址:https://www.cnblogs.com/zzuli2sjy/p/5444636.html
Copyright © 2011-2022 走看看