Четвёртый открытый Зеленоградский турнир 2008

#include <stdio.h>
int main(){
        const unsigned limit = 19580000, module = 2147483647, add = 1234567890;
        putchar('0');
 
int not3[33] = {1814225, 2302521, 5802141, 6018533, 6748043, 7376999, 8331290, 8384746, 
8684370, 8906903, 9351610, 10514663, 10537445, 10833849, 11729324, 11817292, 11938310, 
12241472, 14747269, 15942195,16697130, 16760699,16921012, 17223857, 17396747, 18525295, 
18803409, 19178068, 19410255, 19431851, 19517128, limit};
 
        unsigned m = 1, t, a, at, s, k;
        unsigned i, left = 2, right = not3[0], c = 1;
do{
        for(i = left; i < right; i++){
                m += add; m &= module;
 
                if(m % 3 == 0 || m % 5 == 0 || m % 7 == 0 || m % 11 == 0 || m % 13 == 0 
                || m % 17 == 0 || m % 19 == 0 || m % 23 == 0 || m % 29 == 0 || m % 31 == 0 
                || m % 37 == 0 ||  m % 43 == 0){putchar('0');
goto cont;}
 
                t = m - 1; s = 0;
                while( !(t & 1)){t >>= 1; s++;}
                k = t, at = 1, a = 3;
                while(k){
                        if( (k & 1)){k--; asm volatile("mull %%ebx\n\t divl %%ecx":"=d"(at):"a"(at),"b"(a),"c"(m));}
                        else{k >>= 1; asm volatile("mull %%eax\n\t divl %%ebx":"=d"(a):"a"(a),"b"(m));}
                }
                if( at == 1 || at == m - 1){
                        putchar('1'); goto cont;
                } else{
                        k = 1;
                        while( k < s){
                                k++;
                                asm volatile("mull %%eax\n\t divl %%ebx":"=d"(at):"a"(at),"b"(m));
                                if(at == m - 1){ putchar('1'); goto cont;}
                        }
                }
                putchar('0');
 
cont:
                k = 0;
        }
        putchar('0');
        m += add; m &= module;
        left = not3[c - 1] + 1; right = not3[c]; c++;
}while(c <= 33);
        return 0;
}