#include<vector>
#include<iostream>
#include<algorithm>
#include<cstdlib>

using namespace std;

/* bruk:
 *
 * ./a.out N [k] [fram] [tilbake] [limit] [k2]
 * N = antall noder
 * k = høyeste verdien på en kant
 * fram = sannsynligheten for at en vi har en kant som går fra en 
 * lav-nummerert node til en høyere [i intervallet 0-1]
 * tilbake = tilsvarer fram [også intervallet 0-1]
 * limit = hvor mange noder kan vi hoppe fram (fra x til node x+limit-1)
 * k2 = samme som k, men for nodene som går ut av kilden/inn til sluket
 */

int main(int argc,char** argv){
  int N=0;
  if (argc>1) N = atoi(argv[1]);
  int k=9;
  if (argc>2) k = atoi(argv[2]);
  float fram = 0.2;
  if (argc>3) fram = atof(argv[3]);
  float tilbake = 0.15;
  if (argc>4) tilbake = atof(argv[4]);
  int limit = 10000;
  if (argc>5) limit = atoi(argv[5]);
  srand(time(NULL));
  int k2=k;
  if (argc>6) k2 = atoi(argv[6]);
  vector<vector<int> > graph (N,vector<int>(N,0));
  vector<int> permutation(N);
  for (int i=0;i<N;i++){
    permutation[i]=i;
  }
  /* merk at rekkefølgen på nodene blir randomisert */
  random_shuffle(permutation.begin()+1,permutation.end()-1);
  for (int i=0;i<N-1;i++){
    int antfram=0;
    /* framovernoder */
     for (int j=i+1;j<N && j-i<limit;j++){
      if (rand()<=RAND_MAX*fram){
	if (i==0 || j==N-1){
	  graph[permutation[i]][permutation[j]]=rand()%k2+1;
	}
	else
	  graph[permutation[i]][permutation[j]]=rand()%k+1;
	antfram++;
      }
    }
    /* minst en framovernode */
    if (antfram==0){
      graph[permutation[i]][permutation[i+1]]=rand()%k+1;
    }
    /* bakovernoder */
    for(int j=1;j<i;j++){
      if(rand()<=RAND_MAX*tilbake){
	graph[permutation[i]][permutation[j]]=rand()%k+1;
      }
    }
  }
  cout<<N<<endl;
  for (int i=0;i<N;i++){
    for (int j=0;j<N;j++){
      cout<<graph[i][j]<<' ';
    }
    cout<<endl;
  }
}

