//   searchLLR b n1@n2 <source
//   b is the base, source provides a series of linear families s1{d}s2, 
//   n1 is the first repetition number of d, n2 the last one
//   the program creates a sieve of exponents to analyse, 
//   then calls llr64; results are sent to lresu<b>00.txt
#include <list>
#include <string>
#include <vector>
#include <iostream>
#include <fstream>
#include <time.h>
#include <sstream>
#include <stdlib.h>
#define factl 100000
using namespace std;
using sint=long int; // std::vector<std::__cxx11::basic_string<char> >::size_type;

string p,p1,p2,pp,s,ss,sss,lru,pref;
sint b,j,lgmin,lgmax,x1,x2,b1,b2,k,k1,k2,lg,lg1;
vector <sint> fact,listn; 
char tr[128]; int w[128];
ofstream result,lresult; 

void buildfact()
 {sint kk,n,nn,n1; bool ok; 
  fact.push_back(2);fact.push_back(3);fact.push_back(5);
  nn=1;n1=factl;
  for(lg1=0;nn<n1;lg1++){nn=nn*b;}
  lg1=2*lg1;
  for(n=7;true;n++)
   {ok=true;for(kk=0;fact[kk]*fact[kk]<=n;kk++)if(n%fact[kk]==0){ok=false;break;}
    if(ok){fact.push_back(n);if(n>nn)break;}
   }
 }

bool ok(unsigned long long int n) // is prime?
 {sint kk;
 if (n<2) return false;
 for (kk=0;fact[kk]*fact[kk]<=n;kk++)
     {if(n % fact[kk]==0)return  false;}
 return true;
 }

sint gcd(sint a,sint b)
 {if(b==0)return a;
  return gcd(b,a%b);
 }

int main(int argc, char *argv[])
{int i,c,x,n; string bs,com; bs=argv[1]; b=atoi(argv[1]); 
 for(char c='0';c<='9';c++){w[c]=0+c-'0';tr[0+c-'0']=c;}
 for(char c='A';c<='Z';c++){w[c]=10+c-'A';tr[10+c-'A']=c;}
 for(char c='a';c<='z';c++){w[c]=36+c-'a';tr[36+c-'a']=c;}
 buildfact(); 
 s=argv[2]; for(i=0;i<s.length();i++)if(s[i]=='@')break; 
            ss=s.substr(0,i);lgmin=stoi(ss);
            if(i!=s.length()){sss=s.substr(i+1,s.length());lgmax=stoi(sss);} else {lgmax=lgmin;lgmin=2;}
 pref="llr-data"+bs; lru="lresu"+bs+"00.txt";
 lresult.open(lru.c_str(),ios::app);
 lresult<<"search for possible exponents in base "<<b<<"; lgmin="<<lgmin<<", lgmax="<<lgmax<<"; greater tested prime factor="<<fact.back()<<"\n";
 lresult.close();
 while(cin>>p) 
      {lresult.open(lru.c_str(),ios::app); lresult<<p<<":";
       result.open(pref.c_str(),ios::trunc);
       lg=0;x1=0;for(j=0;j<p.length();j++) if(p[j]=='{')break;else{lg++;x1=x1*b+w[p[j]];}j++; 
       c=w[p[j]];j++; if(p[j]!='}')abort();x2=0;b2=1;
       for(j=j+1;j<p.length();j++){x2=x2*b+w[p[j]];b2=b2*b;}
       b1=b-1;k1=(b1*x1+c)*b2;k2=b1*x2-c*b2;
       k=gcd(abs(k2),gcd(k1,b1));k1=k1/k;k2=k2/k;b1=b1/k;
       if(k2>=0){if(b1!=1)
                  {result<<"ABC ("<<k1<<"*"<<b<<"^n+"<<k2<<")/"<<b1<<"\n";
                   lresult<<"ABC ("<<k1<<"*"<<b<<"^n+"<<k2<<")/"<<b1<<"\n";
                  }
                else
                  {result<<"ABC "<<k1<<"*"<<b<<"^n+"<<k2<<"\n";
                   lresult<<"ABC "<<k1<<"*"<<b<<"^n+"<<k2<<"\n";
                  }
                }
       else{if(b1!=1)
                  {result<<"ABC ("<<k1<<"*"<<b<<"^n"<<k2<<")/"<<b1<<"\n";
                   lresult<<"ABC ("<<k1<<"*"<<b<<"^n"<<k2<<")/"<<b1<<"\n";
                  }
                else
                  {result<<"ABC "<<k1<<"*"<<b<<"^n"<<k2<<"\n";
                   lresult<<"ABC "<<k1<<"*"<<b<<"^n"<<k2<<"\n";
                  }
            }
       listn.clear();for(j=lgmin;j<=lgmax;j++)listn.push_back(j); 
       for(i=0;i<fact.size();i++)
        {x=x1;n=0;
         for(j=0;j<listn.size();j++)
          {for(k=n;k<listn[j];k++)x=(x*b+c)%fact[i];n=listn[j];
           if((x*b2+x2)%fact[i]==0){listn.erase(listn.begin()+j);j--;}
          }
        }
       for(j=0;j<listn.size();j++)result<<listn[j]<<"\n";result.close();
       lresult.close();
       com="rm llr"+bs+"00.ini";
       system(com.c_str());
       com="llr64 -d "+pref+" -oStopOnSuccess=1 -oBPSW=1 -a"+bs+"00  >brol";
       system(com.c_str());
      }
} // fin main