#include <stdio.h>
p(n,i,z){return--i?p(n,i,z*i*i%n):z%n;} //is n prime?
c;
f(a,i,n)int*a;{
return i<0||i/n ? c //are we out of array -> return # of steps
:c++>n ? 0 //Did we move more than n-times? -> We can't escape (Pigeonhole principle)
:i&&p(i,i,1) ? f(a,i-a[i],n) //is index i a prime? -> move left
: f(a,a[i],n); // move right
}
int main(void) {
int a[] = {2,5,6,8,1,2,3};
int b[] = {2,0,2};
int x[] = {14,1,2,5,1,3,51,5,12,3,4,41,15,4,12,243,51,2,14,51,12,11};
printf("%d\n", f
(a
,3, sizeof(a
)/sizeof(*a
))); c = 0;
printf("%d\n", f
(b
,2, sizeof(b
)/sizeof(*b
))); c = 0;
printf("%d\n", f
(x
,5, sizeof(x
)/sizeof(*x
))); return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgoKcChuLGkseil7cmV0dXJuLS1pP3AobixpLHoqaSppJW4pOnolbjt9IC8vaXMgbiBwcmltZT8KYzsKZihhLGksbilpbnQqYTt7CglyZXR1cm4gaTwwfHxpL24gPyBjIC8vYXJlIHdlIG91dCBvZiBhcnJheSAtPiByZXR1cm4gIyBvZiBzdGVwcwoJICA6YysrPm4gPyAwICAvL0RpZCB3ZSBtb3ZlIG1vcmUgdGhhbiBuLXRpbWVzPyAtPiBXZSBjYW4ndCBlc2NhcGUgKFBpZ2VvbmhvbGUgcHJpbmNpcGxlKQoJICAgIDppJiZwKGksaSwxKSA/IGYoYSxpLWFbaV0sbikgLy9pcyBpbmRleCBpIGEgcHJpbWU/IC0+IG1vdmUgbGVmdAoJICAgICAgOiBmKGEsYVtpXSxuKTsgIC8vIG1vdmUgcmlnaHQKfSAgICAKCgppbnQgbWFpbih2b2lkKSB7CglpbnQgYVtdID0gezIsNSw2LDgsMSwyLDN9OwoJaW50IGJbXSA9IHsyLDAsMn07CglpbnQgeFtdID0gezE0LDEsMiw1LDEsMyw1MSw1LDEyLDMsNCw0MSwxNSw0LDEyLDI0Myw1MSwyLDE0LDUxLDEyLDExfTsKCXByaW50ZigiJWRcbiIsIGYoYSwzLCBzaXplb2YoYSkvc2l6ZW9mKCphKSkpOwoJYyA9IDA7CglwcmludGYoIiVkXG4iLCBmKGIsMiwgc2l6ZW9mKGIpL3NpemVvZigqYikpKTsKCWMgPSAwOwoJcHJpbnRmKCIlZFxuIiwgZih4LDUsIHNpemVvZih4KS9zaXplb2YoKngpKSk7CglyZXR1cm4gMDsKfQo=