UVa369 - Combinations

来源:互联网 发布:2017网络洗脑神曲 编辑:程序博客网 时间:2024/06/05 14:46
#include <stdio.h>long gcd(long a, long b);void divideGcd(long *a, long *b);long c(long n, long k);int main(){    long n, m;    while (scanf("%ld%ld", &n, &m) && (n + m))    {        printf("%ld things taken %ld at a time is %ld exactly.\n", n, m, c(n, m));    }    return 0;}long gcd(long a, long b){    return b == 0?a:gcd(b, a % b);}void divideGcd(long *a, long *b){    long g = gcd(*a, *b);    *a = *a / g;    *b = *b / g;}long c(long n, long k){    long numerator = 1, denominator = 1, toMul, toDiv, i;    if (k > n / 2)        k = n - k;    for (i = k; i > 0; i--)    {        toMul = n - k + i;        toDiv = i;        divideGcd(&toMul, &toDiv);        divideGcd(&numerator, &toDiv);        divideGcd(&toMul, &denominator);        numerator *= toMul;        denominator *= toDiv;    }    return numerator / denominator;}

原创粉丝点击