// random-walk search for distinct permanents of 9x9 0/1 matrices
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#define N 9
#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 perm(int *r){ // r[i] bitmask of row i; Ryser with gray code
  long col[N]={0}; long tot=0; int sub=0;
  for(int k=1;k<(1<<N);k++){
    int j=__builtin_ctz(k); int s=(sub>>j)&1; sub^=1<<j; int d=s?-1:1;
    for(int i=0;i<N;i++) col[i]+=d*((r[i]>>j)&1);
    long p=1; for(int i=0;i<N;i++){p*=col[i]; if(!p)break;}
    int bits=__builtin_popcount(sub);
    tot += ((N-bits)&1)? -p : p;
  }
  return tot;
}
int main(int argc,char**argv){
  long iters=atol(argv[1]); rs^=atol(argv[2])*0x9E3779B97F4A7C15ULL;
  int r[N]; long cnt=0;
  FILE*f=fopen(argv[3],"a");
  for(long it=0;it<iters;it++){
    if(it%200000==0){ int dens=rnd()%100; for(int i=0;i<N;i++){r[i]=0;for(int j=0;j<N;j++) if((int)(rnd()%100)<dens) r[i]|=1<<j;} }
    int i=rnd()%N,j=rnd()%N; r[i]^=1<<j;
    long p=perm(r); if(p<0)p=-p;
    if(!seen[p]){seen[p]=1;cnt++; fprintf(f,"%ld",p); for(int k=0;k<N;k++)fprintf(f," %d",r[k]); fprintf(f,"\n");}
  }
  fclose(f); printf("distinct %ld\n",cnt);
}
