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 ≤ n
2).
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;
}