圆排列

myhalfsea posted @ 2010年5月05日 20:32 in 未分类 , 1630 阅读

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);
    }
}


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter
Host by is-Programmer.com | Power by Chito 1.3.3 beta
Butterfly Theme | Design: HRS Hersteller of mobile Hundeschule.