Description
Inspired by a "Little Bishops" problem, Petya now wants to solve problem for rooks.
A rook is a piece used in the game of chess which is played on a board of square grids. A rook can only move horizontally and vertically from its current position and two rooks attack each other if one is on the path of the other.
Given two numbers n and k, your job is to determine the number of ways one can put k rooks on an n × n chessboard so that no two of them are in attacking positions.
A rook is a piece used in the game of chess which is played on a board of square grids. A rook can only move horizontally and vertically from its current position and two rooks attack each other if one is on the path of the other.
Given two numbers n and k, your job is to determine the number of ways one can put k rooks on an n × n chessboard so that no two of them are in attacking positions.
Input
The input file contains two integers n (1 ≤ n ≤ 10) and k (0 ≤ k ≤ n2).
Output
Print a line containing the total number of ways one can put the given number of rooks on a chessboard of the given size so that no two of them are in attacking positions.
Sample Input
Input
4 4
Output
24
根据规则,每一行只能有一个棋子,采用排列组合的话,
1.当n > k 时,为0.
2.当n = k 时,为A(n,k).
3.当k < n的时候,从n列中拿出k行,剩余n-k+1行。k行则与 n=k 时的排列时一样的,即A(n,k),将剩余的n-k+1行插入k行中,为C(n,k)。所以总的摆放数为:A(n,k)*C(n,k).
#include <iostream> #include <cmath> #include <cstring> #include <algorithm> using namespace std; int main() { int n,k; while(cin>>n>>k) { if(k > n) cout<<0<<endl; else { int sum = 1; for(int i = k; i>= 1; i--) sum *= i; int cnk = 1; for(int i = n; i>= n-k+1; i--) { cnk *= i; } for(int i = k ; i>= 1; i--) { cnk /= i; } sum = sum*cnk*cnk; cout<<sum<<endl; } } return 0; }