1. 程式人生 > >2017百度之星初賽B Chess

2017百度之星初賽B Chess

tput long put 它的 ucc others style info 同一行

Chess

Accepts: 1805 Submissions: 5738 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem Description

車是中國象棋中的一種棋子,它能攻擊同一行或同一列中沒有其他棋子阻隔的棋子。一天,小度在棋盤上擺起了許多車……他想知道,在一共N×M個點的矩形棋盤中擺最多個數的車使其互不攻擊的方案數。他經過思考,得出了答案。但他仍不滿足,想增加一個條件:對於任何一個車A,如果有其他一個車B在它的上方(車B行號小於車A),那麽車A必須在車B的右邊(車A列號大於車B)。

現在要問問你,滿足要求的方案數是多少。

Input

第一行一個正整數T,表示數據組數。

對於每組數據:一行,兩個正整數N和M(N<=1000,M<=1000)。

Output

對於每組數據輸出一行,代表方案數模1000000007(1e9+7)。

Sample Input
1
1 1
Sample Output
1

這題第一反應是搜索,不過看到方案數的範圍就知道肯定超時。因為每種方案都是一種排列組合,於是直覺就想到了楊輝三角,索性手寫了幾個樣例,把較小的幾種方案列出來,果然找到了規律。

規律:(n,m)方案數 ps:n,m滿足對稱性

(1,1) (1,2) (1,3) (1,4) (1,5) (1,6)

1 2 3 4 5 6

(2,2) (2,3) (2,4) (2,5) (2,6)

1 3 6 10 15

(3,3) (3,4) (3,5) (3,6)

1 4 10 20

(4,4) (4,5) (4,6)

1 5 15

(5,5) (5,6)

1 6

(6,6)

1

很顯然,方案數就是一個倒置的楊輝三角。a[i][j]=a[i-1][j-1]+a[i][j-1]

#include<stdio.h>
#include<stdlib.h>

long long a[1005][1005];

int main()
{
    int t,n,m,i,j;
    for(i=0;i<=1000;i++){
        a[0][i]=1;
    }
    for(i=1;i<=1000;i++){
        for(j=i;j<=1000;j++){
            a[i][j]=a[i-1][j-1]+a[i][j-1];
            if(a[i][j]>=1000000007) a[i][j]%=1000000007;
        }
    }
    scanf("%d",&t);
    while(t--){
        scanf("%d%d",&n,&m);
        if(n<m) printf("%lld\n",a[n][m]);
        else printf("%lld\n",a[m][n]);
    }
    return 0;
}

2017百度之星初賽B Chess