计算组合

#include <stdio.h>

__int64 C(__int64 n,__int64 k)
{
    
if (k<0)return -1;
    
if (k>n-k)
        
return C(n,n-k);
    
if ( k == 0 )return 1;
    
if ( k == 1 )return n;
    
int i;
    __int64 re 
= C(n-1,k-1);
    
for ( i = k ; i >= 2 ; i-- )
    
{
        
while ( re % i == 0 && k % i == 0 )
        
{
            re 
/= i;
            k
/=i;
        }

        
while ( n % i == 0 && k % i == 0 )
        
{
            n 
/= i;
            k
/=i;
        }

        
if ( k == 1 ) break;
    }

    
if (k!=1){int p = 0,q = 1 / p;}
    re 
= re * n ;
    
return re ;
}


int main ()
{

    __int64 n, k;

    
while ( scanf ( "%I64d%I64d"&n, &k ) != EOF && ( n || k ) )
    
{
        printf ( 
"%I64d\n", C ( n, k ) );
    }

    
return 0;
}

运算,地址:http://acm.pku.edu.cn/JudgeOnline/problem?id=2249