#include <stdio.h>

// Author: Daniel "3ICE" Berezvai
int solutionCount=0;
int howManySolutionsDoYouWant=3;
unsigned long long iterationCount=0; //3ICE: Even this overflows, but I can't do better without including BigNumber.c which I don't want to do.
unsigned long long iterationMaxCount;
int noCollision;
int bigModulo=1000;
int upperModulo=1999;
int constUpperLimit=99;
int i,a,b,c,d,e,f,s;
int taken[18];

int main(){
 iterationMaxCount=(upperModulo-bigModulo)*constUpperLimit*constUpperLimit*constUpperLimit*constUpperLimit*constUpperLimit*constUpperLimit;

 //3ICE: Use this if you edit the constants to be WAY smaller.
 //printf("Hash finder begin!\nThere will be %I64u iterations at most.\n",iterationMaxCount);

 //3ICE: Woraround for 64bit not being large enough.
 printf("Hash finder begin!\nThere will be 940 538 669 251 599 iterations at most.\n");
 //3ICE: Yes, this nested loop is 7 levels deep from the get go. ...
 for(;bigModulo<upperModulo;bigModulo++){
  for(a=0;a<constUpperLimit;a++){
   for(b=0;b<constUpperLimit;b++){
    for(c=0;c<constUpperLimit;c++){
     for(d=0;d<constUpperLimit;d++){
      for(e=0;e<constUpperLimit;e++){
       for(f=0;f<constUpperLimit;f++){
        if(solutionCount>=howManySolutionsDoYouWant){
         printf("Done. Found all %u requested solutions after only %I64u iterations.\n",solutionCount,iterationCount);
         return 0;
        }
        iterationCount++;
        if(iterationCount%10000000==0){
         printf("Tested %I64u combinations.\n",iterationCount);
        }
        noCollision=1;
        //3ICE: ... And it has both a normal loop and a ...
        for(i=0;i<18;i++){taken[i]=0;}
        s=((a*'A'+b*'3'+c*'2'+d*'B'+e*'O'+f*'2')%bigModulo)%18;
        if(taken[s]==0){
         taken[s]=1;
        }else{
         noCollision=0;
         continue;
        }
        //3ICE: ... hardcoded (manually unpacked) loop inside, making it 8 levels deep:
        s=((a*'B'+b*'P'+c*'W'+d*'D'+e*'H'+f*'8')%bigModulo)%18; if(taken[s]==0){taken[s]=1;}else{noCollision=0;continue;}
        s=((a*'I'+b*'Y'+c*'I'+d*'H'+e*'9'+f*'4')%bigModulo)%18; if(taken[s]==0){taken[s]=1;}else{noCollision=0;continue;}
        s=((a*'A'+b*'M'+c*'S'+d*'A'+e*'K'+f*'O')%bigModulo)%18; if(taken[s]==0){taken[s]=1;}else{noCollision=0;continue;}
        s=((a*'N'+b*'7'+c*'O'+d*'K'+e*'D'+f*'Z')%bigModulo)%18; if(taken[s]==0){taken[s]=1;}else{noCollision=0;continue;}
        s=((a*'D'+b*'J'+c*'Q'+d*'1'+e*'6'+f*'O')%bigModulo)%18; if(taken[s]==0){taken[s]=1;}else{noCollision=0;continue;}
        s=((a*'W'+b*'W'+c*'V'+d*'K'+e*'2'+f*'1')%bigModulo)%18; if(taken[s]==0){taken[s]=1;}else{noCollision=0;continue;}
        s=((a*'J'+b*'K'+c*'R'+d*'7'+e*'Z'+f*'R')%bigModulo)%18; if(taken[s]==0){taken[s]=1;}else{noCollision=0;continue;}
        s=((a*'D'+b*'B'+c*'I'+d*'O'+e*'C'+f*'9')%bigModulo)%18; if(taken[s]==0){taken[s]=1;}else{noCollision=0;continue;}
        s=((a*'Q'+b*'G'+c*'2'+d*'C'+e*'B'+f*'R')%bigModulo)%18; if(taken[s]==0){taken[s]=1;}else{noCollision=0;continue;}
        s=((a*'H'+b*'M'+c*'0'+d*'2'+e*'M'+f*'I')%bigModulo)%18; if(taken[s]==0){taken[s]=1;}else{noCollision=0;continue;}
        s=((a*'B'+b*'2'+c*'1'+d*'K'+e*'E'+f*'S')%bigModulo)%18; if(taken[s]==0){taken[s]=1;}else{noCollision=0;continue;}
        s=((a*'F'+b*'3'+c*'D'+d*'3'+e*'D'+f*'4')%bigModulo)%18; if(taken[s]==0){taken[s]=1;}else{noCollision=0;continue;}
        s=((a*'C'+b*'F'+c*'2'+d*'R'+e*'H'+f*'U')%bigModulo)%18; if(taken[s]==0){taken[s]=1;}else{noCollision=0;continue;}
        s=((a*'Q'+b*'0'+c*'W'+d*'Q'+e*'S'+f*'H')%bigModulo)%18; if(taken[s]==0){taken[s]=1;}else{noCollision=0;continue;}
        s=((a*'E'+b*'Y'+c*'B'+d*'S'+e*'W'+f*'V')%bigModulo)%18; if(taken[s]==0){taken[s]=1;}else{noCollision=0;continue;}
        s=((a*'K'+b*'7'+c*'F'+d*'O'+e*'N'+f*'H')%bigModulo)%18; if(taken[s]==0){taken[s]=1;}else{noCollision=0;continue;}
        s=((a*'J'+b*'P'+c*'7'+d*'A'+e*'4'+f*'3')%bigModulo)%18; if(taken[s]==0){taken[s]=1;}else{noCollision=0;continue;}
        s=((a*'I'+b*'L'+c*'M'+d*'J'+e*'R'+f*'U')%bigModulo)%18; if(taken[s]==0){taken[s]=1;}else{noCollision=0;continue;}
        if(noCollision){
         solutionCount++;
         printf("Solution:(%da+%db+%dc+%dd+%de+%df)(mod %d)(mod 18)\n",a,b,c,d,e,f,bigModulo);
        }
       }
      }
     }
    }
   }
  }
 }
 printf("Giving up. Only found %d solutions after all %I64u iterations.\n",solutionCount,iterationCount);
 return 0;
}
