2017百度之星初賽B Chess
Chess
Accepts: 1805 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 Input1 1 1Sample 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