#include <stdio.h>

static unsigned long seed=16807;

static char canswer[170]=
"300/LP6/AAA 6\
P   A6/6/0 6L\
 L6 0 A// 0 /\
A06  6 3 60 A\
 P6L0/  P/ A0\
L3PA/ P 60/  \
3 LL/AL A//  \
 A/36AL3P 6 0\
6/6//PLP/0 A \
ALP3L/6LAP/A \
 6660303L6/P3\
6  0/  3L030A\
A AA0L  /L P6";

static char clist[10]=" APL/360 ";

static int answer[169];

unsigned long aplrandom()
{
  unsigned long qu7t5=16807;
  unsigned long qu2t31=2147483647;
  seed = seed*qu7t5%qu2t31;
  return seed;
}

unsigned long frandom(long n)
{
  unsigned long n1;

  n1 = ((aplrandom()*n)>>31)+1;

  return n1;
}

main()
{
  long i,i1,i2,i3;
  char longlist[169];
  unsigned int longseed[169];
  int ok;

  for(i1=0;i1<169;i1++)
  {
    answer[i1]=0;
    for(i2=0;i2<9;i2++)
    {
      if(canswer[i1]==clist[i2])
      {
	answer[i1]=i2+1;
	break;
      }
    }
    if(i1%13==0) printf("\n");
    printf("%d ",answer[i1]);
  }

  printf("\nGenerate list.\n");

  for(i=0; i<2147483646; i++)
  {
    i1 = i%169;
    longseed[i1] = seed;
    longlist[i1] = frandom(9L);
    if(i>=168)
    {
      i3 = i-168;
      ok=1;
      for(i2=0;i2<169;i2++)
      {
	if(answer[i2]==1)
	{
	  if(longlist[(i3+i2)%169] != 1 &&
	     longlist[(i3+i2)%169] != 9)
	  {
	    ok=0;
	    break;
	  }
	}
	else
	{
	  if(longlist[(i3+i2)%169] != answer[i2])
	  {
	    ok=0;
	    break;
	  }
	}
      }
      if(ok)
      {
	printf("OK: %ld %d\n",i3,longseed[i3%169]);
      }
    }
  }

}

