http://10.131.10.118/JudgeOnline/showproblem?problem_id=1088
相信排列大家很熟悉,从3个对象a,b,c中取3个的排列分别abc, acb, bac, bca, cab 和 cba 6个不同的方式 .我们将从n个不同对象中取r个的排列个数计为P(n,r)。而圆排列与排列的不同之处在于圆周排列头尾相邻,比如上例中abc, bca, cab 就属于同一个圆周排列。我们定义从n个互不相同的对象中取r的圆排列数计为Q(n,r).已知n,r请你计算Q(n,r).
input
输入有多组case,每个case一行, 是两个已空格隔开的整数n和r( 0 <= r <= n ),且大小不超过30。
output
每个case输出一个整数,为Q(n,r).
sample input 3 3
sample output 2
分析:
从n个不同元素中不重复地取出m(1≤m≤n)个元素在一个圆周上,叫做这n个不同元素的圆排列。如果一个 m-圆排列旋转可以得到另一个m-圆排列,则认为这两个圆排列相同。n个不同元素的m-圆排列数为n!/[m*(n-m)! 当 m==0 || n ==0 时, 排列数为1.
特别地,当m=n 时,n个不同元素作成的圆排列总数为(n-1)!。
#include<stdio.h>
void main()
{
int n, m, i;
double zi, mu, s;
while( scanf("%d %d", &n, &m) != EOF ){
if( m == 0 || n == 0 ) s = 1;
else {
for( i = 1, zi = 1; i <= n; i++ )
zi *= i;
for( i = 1, mu = m; i <= n-m; i++ )
mu *= i;
s = zi/mu;
}
printf("%.0lf\n", s);
}
}