#include using namespace std; using ll=long long; #define int ll #define rng(i,a,b) for(int i=int(a);i=int(a);i--) #define per(i,b) gnr(i,0,b) #define pb push_back #define eb emplace_back #define a first #define b second #define bg begin() #define ed end() #define all(x) x.bg,x.ed #ifdef LOCAL #define dmp(x) cerr<<__LINE__<<" "<<#x<<" "< void chmax(t&a,u b){if(a void chmin(t&a,u b){if(b using vc=vector; template using vvc=vc>; using pi=pair; using vi=vc; template ostream& operator<<(ostream& os,const pair& p){ return os<<"{"< ostream& operator<<(ostream& os,const vc& v){ os<<"{"; for(auto e:v)os< void dmpr(ostream&os,const T&t,const Args&... args){ os< ostream& operator<<(ostream&os,const array&a){ return os<(all(a)); } template void print_tuple(ostream&,const T&){ } template void print_tuple(ostream&os,const T&t){ if(i)os<<","; os<(t); print_tuple(os,t); } template ostream& operator<<(ostream&os,const tuple&t){ os<<"{"; print_tuple<0,tuple,Args...>(os,t); return os<<"}"; } void print(ll x,int suc=1){ cout<>i; return i; } vi readvi(int n,int off=0){ vi v(n); rep(i,n)v[i]=read()+off; return v; } template void print(const vector&v,int suc=1){ rep(i,v.size()) print(v[i],i==int(v.size())-1?suc:2); } string readString(){ string s; cin>>s; return s; } template T sq(const T& t){ return t*t; } //#define CAPITAL void yes(bool ex=true){ #ifdef CAPITAL cout<<"YES"< void mkuni(vc&v){ sort(all(v)); v.erase(unique(all(v)),v.ed); } ll rand_int(ll l, ll r) { //[l, r] #ifdef LOCAL static mt19937_64 gen; #else static random_device rd; static mt19937_64 gen(rd()); #endif return uniform_int_distribution(l, r)(gen); } template int lwb(const vc&v,const t&a){ return lower_bound(all(v),a)-v.bg; } using uint=unsigned; using ull=unsigned long long; //initfact(); //const uint mod=998244353; //const uint mod=1000000007; uint mod=1; struct mint{ uint v; mint(ll vv=0){s(vv%mod+mod);} mint& s(uint vv){ v=vv>=1; } return res; } mint inv()const{return pow(mod-2);} /*mint inv()const{ int x,y; int g=extgcd(v,mod,x,y); assert(g==1); if(x<0)x+=mod; return mint(x); }*/ friend mint operator+(int x,const mint&y){ return mint(x)+y; } friend mint operator-(int x,const mint&y){ return mint(x)-y; } friend mint operator*(int x,const mint&y){ return mint(x)*y; } friend mint operator/(int x,const mint&y){ return mint(x)/y; } friend ostream& operator<<(ostream&os,const mint&m){ return os<=0;i--){ finv[i]=finv[i+1]*(i+1); } for(int i=vmax-1;i>=1;i--){ invs[i]=finv[i]*fact[i-1]; } } mint choose(int n,int k){ return fact[n]*finv[n-k]*finv[k]; } mint binom(int a,int b){ return fact[a+b]*finv[a]*finv[b]; } mint catalan(int n){ return binom(n,n)-(n-1>=0?binom(n-1,n+1):0); } template struct Vector{ vector v; Vector(int s=0){ v.resize(s,num(0)); } int size()const{ return v.size(); } num& operator[](int i){ return v[i]; } num const& operator[](int i)const{ return v[i]; } Vector& operator+=(const Vector&rhs){ assert(size()==rhs.size()); rep(i,size()) v[i]+=rhs[i]; return *this; } Vector& operator-=(const Vector&rhs){ assert(size()==rhs.size()); rep(i,size()) v[i]-=rhs[i]; return *this; } Vector& operator*=(const num&x){ rep(i,size()) v[i]*=x; return *this; } Vector& operator/=(const num&x){ num y=num(1)/x; rep(i,size()) v[i]*=y; return *this; } Vector operator+(const Vector&rhs)const{ return Vector(*this)+=rhs; } Vector operator-(const Vector&rhs)const{ return Vector(*this)-=rhs; } Vector operator*(const num&x)const{ return Vector(*this)*=x; } Vector operator/(const num&x)const{ return Vector(*this)/=x; } bool operator==(const Vector&rhs)const{ return v==rhs.v; } }; template num dot(const Vector&a,const Vector&b){ assert(a.size()==b.size()); const int s=a.size(); num ans(0); rep(i,s) ans+=a[i]*b[i]; return ans; } template ostream&operator<<(ostream&os,const Vector&v){ return os< struct Matrix{ using V=Vector; vector m; Matrix(int s=0,num z=num(0)){ m.resize(s,V(s)); rep(i,size()) m[i][i]=z; } int size()const{ return m.size(); } Matrix operator*(const Matrix&rhs)const{ assert(size()==rhs.size()); Matrix res(size()); rep(i,size())rep(j,size())rep(k,size()) res[i][j]+=m[i][k]*rhs[k][j]; return res; } Matrix& operator*=(const Matrix&rhs){ return *this=(*this)*rhs; } V operator*(const V&rhs)const{ assert(size()==rhs.size()); V res(size()); rep(i,size()) res[i]=dot(m[i],rhs); return res; } V& operator[](int i){ return m[i]; } V const& operator[](int i) const{ return m[i]; } Matrix& operator/=(const num&r){ rep(i,m.size())m[i]/=r; return *this; } Matrix operator/(const num&r)const{ return Matrix(*this)/=r; } bool operator==(const Matrix&rhs)const{ return m==rhs.m; } }; template ostream&operator<<(ostream&os,const Matrix&x){ const int s=x.size(); os<<"----------"<>=1; } return res; } F inv()const{ return pow(ll(mod)*mod-2); } bool operator<(const F&r)const{ if(a!=r.a)return a1)res.pb(x); sort(all(res)); return res; } //require a^s=1 //minimum n s.t. a^n=b, 0<=n<=s-1 //or -1 if infeasible template int discrete_log(t a,t b,int s){ dmp2(a,b,s); assert(a.pow(s)==t(1)); const int L=ceil(sqrt(s)); int ans=inf; map v; { t x=a.pow(L); t cur(1); for(int i=0;i=s) ans=-1; else{ dmp(L); dmp(ans); assert(inc(0,ans,s-1)); assert(a.pow(ans)==b); } return ans; } //require a^s=1 //returns minimum p s.t. a^p=1 template int mult_period(t a,int s){ vi f=factors(s); int p=s; for(auto v:f){ while(p%v==0){ if(a.pow(p/v)==t(1)) p/=v; else break; } } return p; } //require b^s=1 //pair of //minimum n s.t. a*b^n=c,0<=n<=s-1 //and period //or (-1,-1) if infeasible template pi discrete_log_helper(t a,t b,t c,int s){ dmp2(a,b,c,s); if(!a||!b){ if(!c)return pi(0,1); else return pi(-1,-1); } assert(b.pow(s)==t(1)); int w=discrete_log(b,c*a.inv(),s); if(w==-1)return pi(-1,-1); return pi(w,mult_period(b,s)); } int norm_mod(int a,int p){ a%=p; if(a<0)a+=p; return a; } //p: odd (not necessarily prime) //10^18 サイズの入力で動くはず(未検証) int jacobi(int a,int p){ a=norm_mod(a,p); auto neg=[](int x){return x%2?-1:1;}; if(a==0) return p==1; else if(a%2) return neg(((p-1)&(a-1))>>1)*jacobi(p%a,a); else return neg(((p&15)*(p&15)-1)/8)*jacobi(a/2,p); } //yosupo sqrt mod //LOJ 150 //p: prime //0<=a

>=1; } assert(cur.b==0); return min(cur.a,p-cur.a); } int extgcd(int a,int b,int&x,int&y){ if(b==0){ x=1; y=0; return a; }else{ int g=extgcd(b,a%b,y,x); y-=a/b*x; return g; } } //x*y=g mod m //returns (g,y) pi modinv(int x,int m){ int a,b; int g=extgcd(x,m,a,b); if(a<0)a+=m/g; return pi(g,a); } //x = a mod b //x = c mod d // => x = p mod q //returns (p,q) or (-1,-1) if infeasible pi crt(int a,int b,int c,int d){ if(b t det22(const Matrix&a){ return a[0][0]*a[1][1]-a[0][1]*a[1][0]; } template Matrix inv22(const Matrix&a){ Matrix res(2); res[0][0]=a[1][1]; res[1][0]=-a[1][0]; res[0][1]=-a[0][1]; res[1][1]=a[0][0]; dmp(res*a); t d=det22(a); assert(d); return res/d; } pi mergeans(pi a,pi b){ if(a==pi(-1,-1)||b==pi(-1,-1))return pi(-1,-1); return crt(a.a,a.b,b.a,b.b); } int normans(pi a){ if(a==pi(-1,-1))return -1; int w=a.a; if(w==0)w+=a.b; return w; } template t general_pow(t a,int n){ if(n>=0)return a.pow(n); else return a.pow(-n).inv(); } //solve the problem given two distinct eigenvalues template int solve_sub(Matrix aa,Matrix bb,t p,t q,int relka){ Matrix a(2); rep(i,2)rep(j,2) a[i][j]=aa[i][j]; Matrix b(2); rep(i,2)rep(j,2) b[i][j]=bb[i][j]; auto getvec=[&](t w){ Vector res(2); if(a[0][0]!=w){ res[0]=-a[0][1]; res[1]=a[0][0]-w; }else{ res[0]=a[1][1]-w; res[1]=-a[1][0]; } return res; }; Vector v[2]; v[0]=getvec(p); v[1]=getvec(q); rep(i,2){ dmp(v[i]); assert(a*v[i]==v[i]*(i==0?p:q)); } Matrix w(2); rep(i,2)rep(j,2) w[i][j]=v[j][i]; dmp(w); Matrix winv=inv22(w); dmp(winv); dmp(w*winv); t ad=det22(a); assert(ad==p*q); Matrix tar=winv*b*w; dmp(tar); if(tar[1][0]||tar[0][1])return -1; t bd=tar[0][0]*tar[1][1]; int off,z; tie(off,z)=discrete_log_helper(t(1),ad,bd,mod-1); if(off==-1)return -1; auto waf=[&](t g,t h){ h/=g.pow(off); g=g.pow(z); int x,per; tie(x,per)=discrete_log_helper(t(1),g,h,relka); if(x==-1)return pi(-1,-1); return pi(off+z*x,z*per); }; return normans(mergeans( waf(p,tar[0][0]), waf(q,tar[1][1]) )); } int solve_simple(Matrix a,Matrix b){ assert(a[0][1]==0); assert(a[1][0]==0); if(b[0][1]||b[1][0])return -1; return normans(mergeans( discrete_log_helper(mint(1),a[0][0],b[0][0],mod-1), discrete_log_helper(mint(1),a[1][1],b[1][1],mod-1) )); } int solve(Matrix a,Matrix b,int brutethreshold=2){ phi=0; if(mod<=brutethreshold){ Matrix cur(2,1); rep(i,mod*mod){ if(i){ if(cur==b){ return i; } } cur*=a; } return -1; } mint c=-a[0][0]-a[1][1]; mint d=a[0][0]*a[1][1]-a[0][1]*a[1][0]; dmp2(c,d); if(d==0){ if(a==b)return 1; pi ans(0,1); rep(i,2)rep(j,2){ pi x=discrete_log_helper(a[i][j],-c,b[i][j],mod-1); ans=mergeans(x,ans); } int ret=normans(ans); if(ret>=0)ret++; return ret; }else{ mint dis=c*c/4-d; dmp(dis); if(dis==0){ mint alpha=-c/2; Matrix apri=a; apri[0][0]-=alpha; apri[1][1]-=alpha; dmp(alpha); Vector v(2); if(apri[0][0]||apri[1][0]) v[0]=1; else if(apri[0][1]||apri[1][1]) v[1]=1; else return solve_simple(a,b); Vector u=apri*v; Matrix w(2); w[0][0]=u[0]; w[1][0]=u[1]; w[0][1]=v[0]; w[1][1]=v[1]; auto winv=inv22(w); auto tar=winv*b*w; if(tar[1][0])return -1; if(tar[0][0]!=tar[1][1])return -1; pi k=discrete_log_helper(mint(1),alpha,tar[0][0],mod-1); if(k==pi(-1,-1))return -1; mint z=tar[0][1]/general_pow(alpha,k.a-1); mint x=(z-k.a)/k.b; int res=k.a+x.v*k.b; if(res==0)res=k.b*mod; return res; }else{ int s=sqrt_mod(dis.v,mod); dmp(s); if(s!=-1){ return solve_sub(a,b,-c/2+s,-c/2-s,mod-1); }else{ phi=dis; return solve_sub(a,b,F(-c/2,1),F(-c/2,-1),mod+1); } } } } bool isprime(int p){ for(int i=2;i*i<=p;i+=(i==2?1:2)) if(p%i==0)return false; return true; } signed main(){ cin.tie(0); ios::sync_with_stdio(0); cout<>n; if(n>0){ mod=n; Matrix a(2),b(2); rep(i,2)rep(j,2)cin>>a[i][j].v; rep(i,2)rep(j,2)cin>>b[i][j].v; cout< a(2),b(2); rep(i,2)rep(j,2) a[i][j]=rand_int(0,mod-1); rep(i,2)rep(j,2) b[i][j]=rand_int(0,mod-1); { cout<