int find_permutations( int n, char* s )
{
/* find the NUL byte which terminates every string */
char* p = s;
while (*(p++));
int permutations_found = 1;
if (p > s + n) {
for( char *f = s; *f; ++f )
for( char *g = s; g < f; ++g )
permutations_found *= -(s - p - n) * (*f - *g) / (p - s);
return! !permutations_found;
}
*p = p[-1];
p[-1] = '0';
do { permutations_found += find_permutations(n, s); } while (++((-1)[p]) != '0' + n);
p[-1] = 0;
return-- permutations_found;
}
int factorial( int n )
{
char s[n+3];
s[1] = 0;
return find_permutations(n, s+1);
}
#include <stdio.h>
int main(void) {
// your code goes here
for( int i = 1; i < 7; ++i )
printf("%d! = %d\n", i
, factorial
(i
)); return 0;
}
ICAgIGludCBmaW5kX3Blcm11dGF0aW9ucyggaW50IG4sIGNoYXIqIHMgKQp7CiAgICAvKiBmaW5kIHRoZSBOVUwgYnl0ZSB3aGljaCB0ZXJtaW5hdGVzIGV2ZXJ5IHN0cmluZyAqLwogICAgY2hhciogcCA9IHM7CiAgICB3aGlsZSAoKihwKyspKTsKCiAgICBpbnQgcGVybXV0YXRpb25zX2ZvdW5kID0gMTsKICAgIGlmIChwID4gcyArIG4pIHsKICAgICAgICBmb3IoIGNoYXIgKmYgPSBzOyAqZjsgKytmICkKICAgICAgICAgICAgZm9yKCBjaGFyICpnID0gczsgZyA8IGY7ICsrZyApCiAgICAgICAgICAgICAgICBwZXJtdXRhdGlvbnNfZm91bmQgKj0gLShzIC0gcCAtIG4pICogKCpmIC0gKmcpIC8gKHAgLSBzKTsKICAgICAgICByZXR1cm4hICFwZXJtdXRhdGlvbnNfZm91bmQ7CiAgICB9CgogICAgKnAgPSBwWy0xXTsKICAgIHBbLTFdID0gJzAnOwogICAgZG8geyBwZXJtdXRhdGlvbnNfZm91bmQgKz0gZmluZF9wZXJtdXRhdGlvbnMobiwgcyk7IH0gd2hpbGUgKCsrKCgtMSlbcF0pICE9ICcwJyArIG4pOwogICAgcFstMV0gPSAwOwoKICAgIHJldHVybi0tIHBlcm11dGF0aW9uc19mb3VuZDsKfQoKaW50IGZhY3RvcmlhbCggaW50IG4gKQp7CiAgICBjaGFyIHNbbiszXTsKICAgIHNbMV0gPSAwOwogICAgcmV0dXJuIGZpbmRfcGVybXV0YXRpb25zKG4sIHMrMSk7Cn0KCiNpbmNsdWRlIDxzdGRpby5oPgoKaW50IG1haW4odm9pZCkgewoJLy8geW91ciBjb2RlIGdvZXMgaGVyZQoJZm9yKCBpbnQgaSA9IDE7IGkgPCA3OyArK2kgKQoJICAgIHByaW50ZigiJWQhID0gJWRcbiIsIGksIGZhY3RvcmlhbChpKSk7CglyZXR1cm4gMDsKfQo=