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

#include <stdio.h>
//#include <ctime>
#define max_step 33333333
#define max_step2 33333380
#define max_step3 33333332
#define  n 2147483647
#define d 1234567890
#define nn 1073741823
#define _d 235249369
char npr[46340];
char prime[max_step2];
int main()
{
#ifdef pperm
	freopen("input.txt","r",stdin);
	freopen("output.txt","w",stdout);
#endif
	int i,j,ti;
	for (i=3;i<46340;i+=2)
	if (!npr[i])
	{
		j=(i<<1)+i;
		while (j<46340)
		{
			npr[j]=1;
			j+=i<<1;
		}
		if (i>80)
		{
rep:		ti=(((j-1)>>1)*_d)&nn;
			if (ti<max_step)
				prime[ti]='0';
			j+=i<<1;
			if (j<0)
				continue;
			goto rep;
		}
	}
	int a;
	a=1277200225;
	for (i=48;i<33333332;)
	{
		if (a%41)
		{
			a=(a+1556220022)&n;
			i+=3;
		}
		else
		{
			a=(a+321652132)&n;
			i+=2;
		}
		prime[i-1]=prime[i-2]='0';
		if (a%41)
		{
			a=(a+85264668)&n;
			i+=94;
		}
		else
		{
			prime[i]='0';
			a=(a+1319832558)&n;
			i+=95;
		}
	}
	for (i=6;i<161;i+=7)
		prime[i]='0';
	a=24405659;
	for (i=581;i<33333332;)
	{
		if (a%17)
		{
			a=(a+38223148)&n;
			i+=294;
		}
		else
		{
			a=(a+2133666158)&n;
			i+=287;
		}
		for (j=7;j<288;j+=7)
			prime[i-j]='0';
		if (a%17)
		{
			a=(a+2105441246)&n;
			i+=407;
		}
		else
		{
			prime[i]='0';
			a=(a+9998236)&n;
			i+=414;
		}
	}
	a=23815727;
	for (i=127;i<33333332;)
	{
		if (a%13)
		{
			a=(a+38223148)&n;
			i+=294;
		}
		else
		{
			a=(a+2133666158)&n;
			i+=287;
		}
		for (j=7;j<288;j+=7)
			prime[i-j]='0';
		if (a%13)
		{
			a=(a+2143074462)&n;
			i+=247;
		}
		else
		{
			prime[i]='0';
			a=(a+47631452)&n;
			i+=254;
		}
	}

	a=321652133;
	for (i=2;i<33333332;)
	{
		if (a%11)
		{
			a=(a+94672972)&n;
			i+=54;
		}
		else
		{
			a=(a+1868463850)&n;
			i+=45;
		}
		for (j=9;j<46;j+=9)
			prime[i-j]='0';
		if (a%11)
		{
			a=(a+1877872154)&n;
			i+=5;
		}
		else
		{
			prime[i]='0';
			a=(a+104081276)&n;
			i+=14;
		}
	}

	a=1556220023;
	for (i=3;i<33333332;)
	{
		if (a%19)
		{
			a=(a+1286608528)&n;
			i+=8;
		}
		else
		{
			a=(a+643304264)&n;
			i+=4;
		}
		prime[i-4]='0';
		if (a%19)
		{
			a=(a+156121914)&n;
			i+=21;
		}
		else
		{
			prime[i]='0';
			a=(a+799426178)&n;
			i+=25;
		}
	}

	a=643304265;
	for (i=4;i<33333332;)
	{
		if (a%5)
		{
			a=(a+321652132)&n;
			i+=2;
		}
		else
		{
			a=(a+1234567890)&n;
			i++;
		}
		prime[i-1]='0';
		if (a%5)
		{
			a=(a+964956396)&n;
			i+=6;
		}
		else
		{
			prime[i]='0';
			a=(a+52040638)&n;
			i+=7;
		}
	}
	a=1;
	prime[0]=prime[33333332]='0';
	prime[33333333]=0;
	for (i=1;i<max_step3;i++)
	{
		a=(a+d)&n;
		if (!prime[i])
			prime[i]=(a<46340)?npr[a]?'0':'1':(a%3&&a%7&&a%23&&a%29&&a%31&&
				a%37&&a%43&&a%47&&a%53&&a%59&&a%61&&a%67&&a%71&&a%73&&a%79)?'1':'0';
	}
	//printf("%d",clock());
	printf("%s",prime);
	return 0;
}