#include <stdio.h>
#include <stdlib.h>
struct nris {int n, r, *is; void (*callback)(const struct nris *); void *context;};
struct nris *create_nris(int n, int r, void (*callback)(const struct nris *), void *context) {
if (n < 1 || n < r || !callback) return 0;
struct nris
*p
= malloc(sizeof (struct nris
)); p->n = n;p->r = r;p->callback = callback;p->context = context;
p
->is
= malloc(sizeof (int) * r
); return p;
}
void delete_nris
(struct nris
*p
) {if (p
) {free(p
->is
);free(p
);}} struct nris *ui2is(struct nris *p, unsigned int ui) {
int i = 0, j;
if (p) for (j = 0; j < p->n; j++) if (ui & (1 << j)) p->is[i++] = j;
return p;
}
void permute(struct nris *p, int l, int r) {
int i, tmp;
if (!p) return;
else if (l == r) p->callback(p);
else {
for (i = l; i <= r; i++) {
#define SWAP(t, p, q) (t = *(p), *(p) = *(q), *(q) = t)
SWAP(tmp, p->is + l, p->is + i);
permute(p, l + 1, r);
SWAP(tmp, p->is + l, p->is + i);
#undef SWAP
}
}
}
void comb(struct nris *p, int need, unsigned int chosen, int at) {
if (!p || p->n < need + at) return;
if (!need) {
ui2is(p, chosen);
permute(p, 0, p->r - 1);
return;
}
comb(p, need - 1, chosen | (1 << at), at + 1);
comb(p, need, chosen, at + 1);
}
void permutations_do(int n, int r, void (*callback)(const struct nris *), void *context) {
struct nris *nris = create_nris(n, r, callback, context);
comb(nris, nris->r, 0, 0);
delete_nris(nris);
}
int _a0b(const int *begin, const int *end, int *a, int *b) {
#define sep 0
if (*begin == sep || *(end - 1) == sep) return 0;
register const int *p;
for (p = begin, *a = 0; *p != sep && p < end; p++) *a = *a * 10 + *p;
for (p = p + 1, *b = 0; *p != sep && p < end; p++) *b = *b * 10 + *p;
#undef sep
return 1;
}
void f8872(const struct nris *p) {
int a, b;
if (_a0b
(p
->is
, p
->is
+ p
->r
, &a
, &b
) && a
* 8 == b
) printf("%d/%d\n", a
, b
); }
void f8883(const struct nris *p) {
int a, b;
if (_a0b
(p
->is
, p
->is
+ p
->r
, &a
, &b
) && a
- b
== 44444) printf("%d-%d\n", a
, b
); }
int main() {
permutations_do(10, 10, f8872, NULL);
permutations_do(10, 10, f8883, NULL);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4Kc3RydWN0IG5yaXMge2ludCBuLCByLCAqaXM7IHZvaWQgKCpjYWxsYmFjaykoY29uc3Qgc3RydWN0IG5yaXMgKik7IHZvaWQgKmNvbnRleHQ7fTsKc3RydWN0IG5yaXMgKmNyZWF0ZV9ucmlzKGludCBuLCBpbnQgciwgdm9pZCAoKmNhbGxiYWNrKShjb25zdCBzdHJ1Y3QgbnJpcyAqKSwgdm9pZCAqY29udGV4dCkgewogIGlmIChuIDwgMSB8fCBuIDwgciB8fCAhY2FsbGJhY2spIHJldHVybiAwOwogIHN0cnVjdCBucmlzICpwID0gbWFsbG9jKHNpemVvZiAoc3RydWN0IG5yaXMpKTsKICBwLT5uID0gbjtwLT5yID0gcjtwLT5jYWxsYmFjayA9IGNhbGxiYWNrO3AtPmNvbnRleHQgPSBjb250ZXh0OwogIHAtPmlzID0gbWFsbG9jKHNpemVvZiAoaW50KSAqIHIpOwogIHJldHVybiBwOwp9CnZvaWQgZGVsZXRlX25yaXMoc3RydWN0IG5yaXMgKnApIHtpZiAocCkge2ZyZWUocC0+aXMpO2ZyZWUocCk7fX0Kc3RydWN0IG5yaXMgKnVpMmlzKHN0cnVjdCBucmlzICpwLCB1bnNpZ25lZCBpbnQgdWkpIHsKICBpbnQgaSA9IDAsIGo7CiAgaWYgKHApIGZvciAoaiA9IDA7IGogPCBwLT5uOyBqKyspIGlmICh1aSAmICgxIDw8IGopKSBwLT5pc1tpKytdID0gajsKICByZXR1cm4gcDsKfQp2b2lkIHBlcm11dGUoc3RydWN0IG5yaXMgKnAsIGludCBsLCBpbnQgcikgewogIGludCBpLCB0bXA7CiAgaWYgKCFwKSByZXR1cm47CiAgZWxzZSBpZiAobCA9PSByKSBwLT5jYWxsYmFjayhwKTsKICBlbHNlIHsKICAgIGZvciAoaSA9IGw7IGkgPD0gcjsgaSsrKSB7CiNkZWZpbmUgU1dBUCh0LCBwLCBxKSAodCA9ICoocCksICoocCkgPSAqKHEpLCAqKHEpID0gdCkKICAgICAgU1dBUCh0bXAsIHAtPmlzICsgbCwgcC0+aXMgKyBpKTsKICAgICAgcGVybXV0ZShwLCBsICsgMSwgcik7CiAgICAgIFNXQVAodG1wLCBwLT5pcyArIGwsIHAtPmlzICsgaSk7CiN1bmRlZiBTV0FQCiAgICB9CiAgfQp9CnZvaWQgY29tYihzdHJ1Y3QgbnJpcyAqcCwgaW50IG5lZWQsIHVuc2lnbmVkIGludCBjaG9zZW4sIGludCBhdCkgewogIGlmICghcCB8fCBwLT5uIDwgbmVlZCArIGF0KSByZXR1cm47CiAgaWYgKCFuZWVkKSB7CiAgICB1aTJpcyhwLCBjaG9zZW4pOwogICAgcGVybXV0ZShwLCAwLCBwLT5yIC0gMSk7CiAgICByZXR1cm47CiAgfQogIGNvbWIocCwgbmVlZCAtIDEsIGNob3NlbiB8ICgxIDw8IGF0KSwgYXQgKyAxKTsKICBjb21iKHAsIG5lZWQsIGNob3NlbiwgYXQgKyAxKTsKfQp2b2lkIHBlcm11dGF0aW9uc19kbyhpbnQgbiwgaW50IHIsIHZvaWQgKCpjYWxsYmFjaykoY29uc3Qgc3RydWN0IG5yaXMgKiksIHZvaWQgKmNvbnRleHQpIHsKICBzdHJ1Y3QgbnJpcyAqbnJpcyA9IGNyZWF0ZV9ucmlzKG4sIHIsIGNhbGxiYWNrLCBjb250ZXh0KTsKICBjb21iKG5yaXMsIG5yaXMtPnIsIDAsIDApOwogIGRlbGV0ZV9ucmlzKG5yaXMpOwp9CgppbnQgX2EwYihjb25zdCBpbnQgKmJlZ2luLCBjb25zdCBpbnQgKmVuZCwgaW50ICphLCBpbnQgKmIpIHsKI2RlZmluZSBzZXAgMAogIGlmICgqYmVnaW4gPT0gc2VwIHx8ICooZW5kIC0gMSkgPT0gc2VwKSByZXR1cm4gMDsKICByZWdpc3RlciBjb25zdCBpbnQgKnA7CiAgZm9yIChwID0gYmVnaW4sICphID0gMDsgKnAgIT0gc2VwICYmIHAgPCBlbmQ7IHArKykgKmEgPSAqYSAqIDEwICsgKnA7CiAgZm9yIChwID0gcCArIDEsICpiID0gMDsgKnAgIT0gc2VwICYmIHAgPCBlbmQ7IHArKykgKmIgPSAqYiAqIDEwICsgKnA7CiN1bmRlZiBzZXAKICByZXR1cm4gMTsKfQp2b2lkIGY4ODcyKGNvbnN0IHN0cnVjdCBucmlzICpwKSB7CiAgaW50IGEsIGI7CiAgaWYgKF9hMGIocC0+aXMsIHAtPmlzICsgcC0+ciwgJmEsICZiKSAmJiBhICogOCA9PSBiKSBwcmludGYoIiVkLyVkXG4iLCBhLCBiKTsKfQp2b2lkIGY4ODgzKGNvbnN0IHN0cnVjdCBucmlzICpwKSB7CiAgaW50IGEsIGI7CiAgaWYgKF9hMGIocC0+aXMsIHAtPmlzICsgcC0+ciwgJmEsICZiKSAmJiBhIC0gYiA9PSA0NDQ0NCkgcHJpbnRmKCIlZC0lZFxuIiwgYSwgYik7Cn0KaW50IG1haW4oKSB7CiAgcGVybXV0YXRpb25zX2RvKDEwLCAxMCwgZjg4NzIsIE5VTEwpOwogIHBlcm11dGF0aW9uc19kbygxMCwgMTAsIGY4ODgzLCBOVUxMKTsKICByZXR1cm4gMDsKfQo=