// 8x9 top block random walk; last row = any subset -> perm = subset sum of 9 cofactors
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#define MAXP 362881
static unsigned char seen[MAXP];
static uint64_t rs=88172645463325252ULL;
static inline uint64_t rnd(){rs^=rs<<13;rs^=rs>>7;rs^=rs<<17;return rs;}
long perm8(int *r,int skip){ // 8 rows, columns = 9 minus skip
  int cols[8],c=0; for(int j=0;j<9;j++) if(j!=skip) cols[c++]=j;
  long col[8]={0},tot=0; int sub=0;
  for(int k=1;k<256;k++){int j=__builtin_ctz(k);int s=(sub>>j)&1;sub^=1<<j;int d=s?-1:1;
    for(int i=0;i<8;i++) col[i]+=d*((r[i]>>cols[j])&1);
    long p=1; for(int i=0;i<8;i++){p*=col[i]; if(!p)break;}
    tot+=((8-__builtin_popcount(sub))&1)?-p:p;}
  return tot;
}
int main(int argc,char**argv){
  long iters=atol(argv[1]); rs^=atol(argv[2])*0x9E3779B97F4A7C15ULL;
  int r[8]; long cf[9]; long cnt=0; FILE*f=fopen(argv[3],"a");
  for(long it=0;it<iters;it++){
    if(it%100000==0){int dens=rnd()%100;for(int i=0;i<8;i++){r[i]=0;for(int j=0;j<9;j++) if((int)(rnd()%100)<dens) r[i]|=1<<j;}}
    r[rnd()%8]^=1<<(rnd()%9);
    for(int j=0;j<9;j++) cf[j]=perm8(r,j);
    long ss=0; int sub=0;
    for(int k=1;k<512;k++){int j=__builtin_ctz(k);int s=(sub>>j)&1;sub^=1<<j; ss+= s?-cf[j]:cf[j];
      if(!seen[ss]){seen[ss]=1;cnt++;fprintf(f,"%ld",ss);for(int i=0;i<8;i++)fprintf(f," %d",r[i]);fprintf(f," %d\n",sub);}}
  }
  fclose(f); printf("distinct %ld\n",cnt);
}
