题目来源
中北大学2018年新生赛
题目描述
田园餐厅有一个能放下m个人的圆桌。
那是去年的一个雨天,他和n - 1个学弟,在田园餐厅买饭,并且他们占下了那个圆桌。
问圆桌的座位有多少种坐法,当然不一定全部的人都能坐到圆桌上。
n >= m
输入描述
每行,一个数n,一个数m
若n =m = -1则输出'EndOfSolution'并退出程序
否则,保证m,n∈{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20}
n >= m
输出描述
每行一个整数表示方案数
样例输入
1 1
2 1
3 1
4 1
20 2
-1 -1
样例输出
1
2
3
4
EndOfSolution
题解:
从n个人里边取出m个人,总共有 C种,然后考虑排列,m个人全排列有m!种情况,但是饭桌是个圆的,每种排列经过旋转后总共有m种,也就是每种情况算了m次,所以排列的种类总共有m!/m种,也就是(m-1)!,最终答案就是 C
*(m-1)! 。最后输出“EndOfSolution”不要输回车符。
代码
#include<algorithm>
#include <iostream>
#include<cstring>
#include <cstdio>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
ll n,m;
ll f(ll x){
if(x==0||x==1) return 1;
ll ans=1;
for(ll i=2;i<=x;i++){
ans*=i;
}
return ans;
}
int main(){
while(scanf("%lld%lld",&n,&m)){
if(n==-1&&m==-1){
printf("EndOfSolution");
break;
}
ll ans=f(n)/f(m)/f(n-m)*f(m-1);
cout<<ans<<endl;
}
return 0;
}