1. C, Doina Logofatu, 2000

/**
* ACM programming Contest WS 08/09
* UVa Status: Accepted
* Run Time: 0.060
* Programming Language: C
* @author Doina Logofatu logofatu@hm.edu
*/

#include <stdio.h>

int main(){
int n, m, a[101];
long int result = 1;
int aux, k, i, j;
while(scanf("%d %d", &n, &k) == 2 && (n || k)){
result=1;
for( j= n-k+1; j <= n; j++) a[j]=j;
for(i = 2; i <= k; i++){
j = 2; aux = i;
while(aux != 1){
if(aux%j==0)
for(m = n-k+1; m<=n && aux!=1; m++)
while (a[m]%j==0 && aux%j==0) {aux /= j; a[m] /= j;}
j++;
}
}
for(m = n-k+1; m<=n; m++) result *= a[m];
printf("%d things taken %d at a time is %ld exactly.\n", n, k, result);
}
return 0;
}


1. C++, Doina Logofatu, 2005
/**
* ACM programming Contest WS 08/09
* UVa Status: Accepted
* Run Time: 0.040
* Programming Language: C++
* @author Doina Logofatu logofatu@hm.edu
*/


#include <map>
#include <fstream>
#include <iostream>
#include <cmath>

using namespace std;

typedef unsigned long int INTEGER;
typedef map<INTEGER, INTEGER> TMap;
typedef pair<INTEGER, INTEGER> Int_Pair;


int isPrime(INTEGER n){
if(n<=1) return 0;
if(n==2) return 1;
if(n%2==0) return 0;
INTEGER sqrtn = (INTEGER)sqrt((double)n);
for(INTEGER i=3; i*i<=n; i+=2)
if(n%i == 0) return 0;
return 1;
}

/*
Für jede Primzahl p kleiner oder gleich n führe aus:
- initialisiere no mit 0 (der Exponent für p in der n!-Primfaktorzerlegung)
- aux nimmt sukzessive die Werte n/p, n/p2, n/p3, ... auf, bis es Null wird
- für jedes aux wird gemäß dem obigen Satz zu exp der Wert aux addiert
- das Paar (p, exp) – (Schlüssel, Wert) wird in m hinzugefügt
*/
TMap getPrimeMap(INTEGER n){
TMap m;
INTEGER p = 2;
while(p <= n){
if(isPrime(p)){
INTEGER aux=n/p;
INTEGER exp=0;
while(aux){
exp += aux;
aux /= p;
}
m.insert(Int_Pair(p, exp));
}
p++;
}
return m;
}

/*
Das Vereinfachen der „Prim-faktorzerlegung” m durch die Primfaktorzerlegung m1 mit Speicherung des Ergebnisses in m. Das erfolgt durch das iterative Abarbeiten aller Paare aus m1. Für jedes Paar:
- wird das Element mit demselben Schlüssel in m gesucht (find)
- werden, wenn dieses Element gefunden ist, die Exponenten (Werte) voneinander subtrahiert
*/
void doSimplify(TMap &m, TMap m1){
TMap::iterator iter, iter1;
for(iter1 = m1.begin();
iter1 != m1.end(); iter1++){
iter = m.find( iter1->first );
if(iter != m.end()){
iter->second -= iter1->second;
}
}
}

/*
Schnelles Potenzieren: berechnet die Potenz b^n .
*/
INTEGER pow(INTEGER b, INTEGER n){
if(n==0) return 1;
if(n==1) return b;
if(n%2==0) return pow(b, n/2)*pow(b, n/2);
return b*pow(b, n-1);
}


INTEGER getNumber(TMap m){
INTEGER l = 1;
TMap::iterator iter;
for(iter = m.begin();iter!=m.end();iter++){
l *= pow(iter->first, iter->second);
}
return l;
}

void doProcess(INTEGER n, INTEGER k){
TMap m, m1;
m = getPrimeMap(n);
m1 = getPrimeMap(k);
doSimplify(m, m1);
m1 = getPrimeMap(n-k);
doSimplify(m, m1);
cout << n << " things taken " << k
<< " at a time is " << getNumber(m)
<< " exactly.\n";
}

int main(){
INTEGER n, k;
cin >> n >> k;
while (n || k){
doProcess(n, k);
cin >> n >> k;
}
return 0;
}