#include <string.h>
#define MAX 46656
#define LMT 216
#define LEN 4830
#define RNG 100032
unsigned base[ MAX/ 64 ] , segment[ RNG/ 64 ] , primes[ LEN] ;
#define sq(x) ((x)*(x))
#define mset(x,v) memset(x,v,sizeof(x))
#define chkC(x,n) (x[n>>6]&(1<<((n>>1)&31)))
#define setC(x,n) (x[n>>6]|=(1<<((n>>1)&31)))
/* Generates all the necessary prime numbers and marks them in base[]*/
void sieve( )
{
unsigned i, j, k;
for ( i= 3 ; i< LMT; i+ = 2 )
if ( ! chkC( base, i) )
for ( j= i* i, k= i<< 1 ; j< MAX; j+ = k)
setC( base, j) ;
for ( i= 3 , j= 0 ; i< MAX; i+ = 2 )
if ( ! chkC( base, i) )
primes[ j++ ] = i;
}
CiNpbmNsdWRlIDxzdHJpbmcuaD4KCiNkZWZpbmUgTUFYIDQ2NjU2CiNkZWZpbmUgTE1UIDIxNgojZGVmaW5lIExFTiA0ODMwCiNkZWZpbmUgUk5HIDEwMDAzMgoKdW5zaWduZWQgYmFzZVtNQVgvNjRdLCBzZWdtZW50W1JORy82NF0sIHByaW1lc1tMRU5dOwoKI2RlZmluZSBzcSh4KSAoKHgpKih4KSkKI2RlZmluZSBtc2V0KHgsdikgbWVtc2V0KHgsdixzaXplb2YoeCkpCiNkZWZpbmUgY2hrQyh4LG4pICh4W24+PjZdJigxPDwoKG4+PjEpJjMxKSkpCiNkZWZpbmUgc2V0Qyh4LG4pICh4W24+PjZdfD0oMTw8KChuPj4xKSYzMSkpKQoKLyogR2VuZXJhdGVzIGFsbCB0aGUgbmVjZXNzYXJ5IHByaW1lIG51bWJlcnMgYW5kIG1hcmtzIHRoZW0gaW4gYmFzZVtdKi8Kdm9pZCBzaWV2ZSgpCnsKICAgIHVuc2lnbmVkIGksIGosIGs7CiAgICBmb3IoaT0zOyBpPExNVDsgaSs9MikKICAgICAgICBpZighY2hrQyhiYXNlLCBpKSkKICAgICAgICAgICAgZm9yKGo9aSppLCBrPWk8PDE7IGo8TUFYOyBqKz1rKQogICAgICAgICAgICAgICAgc2V0QyhiYXNlLCBqKTsKICAgIGZvcihpPTMsIGo9MDsgaTxNQVg7IGkrPTIpCiAgICAgICAgaWYoIWNoa0MoYmFzZSwgaSkpCiAgICAgICAgICAgIHByaW1lc1tqKytdID0gaTsKfQ==