#include #include #include #include using namespace std; double getcputime() { timeval tim; rusage ru; getrusage(RUSAGE_SELF, & ru); tim = ru.ru_utime; double t = (double) tim.tv_sec + (double) tim.tv_usec / 1000000.0; tim = ru.ru_stime; t += (double) tim.tv_sec + (double) tim.tv_usec / 1000000.0; return t; } int num_calls = 0; int num_parties(int members, int size) { num_calls += 1; if (size == 0) return 1; else if (size == members) return 1; else // Consider arbitrarily chosen member X return num_parties(members - 1, size - 1) + // do we invite him/her/it? num_parties(members - 1, size); } // or don't we? no other possibilities int main(int argc, char * argv[]) { if (argc != 3) { cerr << "usage: " << argv[0] << " members party-size\n"; exit(1); } num_calls = 0; int members = atol(argv[1]); int size = atol(argv[2]); double t1 = getcputime(); int answer = num_parties(members, size); double t2 = getcputime(); cout << "There are " << answer << " possible different parties of " << size << " from a population of " << members << "\n"; cout << num_calls << " function calls\n"; cout << setprecision(6) << t2 - t1 << " seconds\n"; }