/* find all primes with 7 digits whose digits are prime 
 * label those whose consecutive pairs are also prime as special */

#include<stdio.h>

int main()
{
  unsigned int i, j;
  unsigned int pidx = 0;
  unsigned char prime[2788];
  unsigned int primes[404];
  memset(prime,1,2788);
  prime[0] = 0;
  prime[1] = 0;
  for(i = 2; i < 2788; ++i)
  {
    if(prime[i])
    {
      for(j = 2*i; j < 2788; j += i)
      {
        prime[j] = 0;
      }
      primes[pidx++] = i;
    }
  }
  /* possible ending digits */
  unsigned int ends[2] = {3, 7};
  /* allowed other digits */
  unsigned int others[4] = {2,3,5,7};
  unsigned int val;
  char failed, special;
  for(i=0;i<8192;++i)
  {
    failed = 0;
    val = ends[i&1] + 10*others[(i>>1)&3] + 100 * others[(i>>3)&3] + 1000 * others[(i>>5)&3] + 10000 * others[(i>>7)&3] + 100000 * others[(i>>9) & 3] + 1000000 * others[(i>>11) & 3];
    for(j=0; j<pidx; ++j)
    {
      if(val % primes[j] == 0)
      {
        failed = 1;
        break;
      }
    }
    /* test for consecutive pairs being prime */
    if(!failed)
    {
      special = 1;
      if(!prime[ends[i&1] + 10*others[(i>>1)&3]])
      {
        special = 0;
      } else {
        for(j=1;j<11;j+=2)
        {
          if(!prime[others[(i>>j)&3] + 10 * others[(i>>(j+2))&3]])
          {
            special = 0;
            break;
          }
        }
      }
      printf(special ? "Special %i\n" : "%i\n", val);
    }
  }
  return 0;
}
