/* gcd(x,y)=1 可推出 gcd(x+y,xy)=1 反证法:gcd(x+y,xy)=c,c>1,那么设x+y=ac,xy=bc 由于xy互质,所以c必定一部分质因子px出自x,另一部分py出自y x+y=a*px*py,其中px*py>1,且(x,y)=1,这是不成立的 假设不成立,所以c=1 所以只要a[i]存在两个及以上质因子,p1^c1 * p2^c2 * ... 就让x=p1^c1,y=a[i]/(p1^c1),就有gcd(x+y,a[i])=1 */ #include<bits/stdc++.h> using namespace std; #define N 500005 #define maxn 10000005 #define ll long long int prime[10000005],m; bool vis[10000005]; vector<int>G[10000005]; void divide(int nn){ int n=nn; for(int i=1;i<=m&& 1ll*prime[i]*prime[i]<=n;i++) { if(n%prime[i]==0) { G[nn].push_back(prime[i]); while(n%prime[i]==0)n/=prime[i]; } } if(n>1)G[nn].push_back(n); } void init(){ for(int i=2;i<maxn;i++){ if(!vis[i]) prime[++m]=i; for(int j=1;j<=m;j++){ if(1ll*prime[j]*i>=maxn)break; vis[1ll*prime[j]*i]=1; if(i%prime[j]==0)break; } } } int d1[N],d2[N],a[N],n; signed main(){ init(); scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%lld",&a[i]); //n=70; //for(int i=1;i<=n;i++)a[i]=i; for(int i=1;i<=n;i++){ if(!vis[a[i]]){ d1[i]=d2[i]=-1; continue; } if(G[a[i]].size()==0)divide(a[i]); if(G[a[i]].size()<=1){ d1[i]=d2[i]=-1; continue; } ll x=1,y=a[i]; while(y%G[a[i]][0]==0)y/=G[a[i]][0],x*=G[a[i]][0]; if(y>1 && x>1)d1[i]=x,d2[i]=y; else d1[i]=d2[i]=-1; } for(int i=1;i<=n;i++)printf("%d ",d1[i]);puts(""); for(int i=1;i<=n;i++)printf("%d ",d2[i]);puts(""); }