根据欧拉函数的表达式我们发现要使答案最大则这个一定有若干个质数相乘
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
const
ll maxn=1000000;
ll prime[maxn+1],tot;
bool check[maxn+1];
const
ll Bt=7;
const
ll M=10000000;
struct H
{
ll len;
ll A[6001];
H(){len=0;memset(A,0,sizeof(A));}
void get()
{
char c[26001];
scanf("%s",c);
ll l=strlen(c);
for(ll i=0;i<l;i++)c[i]-='0';
len=l/Bt+(l%Bt?1:0);
ll t=l%Bt;
if(l%Bt)
{
for(ll i=l%Bt;i;i--)
A[len-1]=A[len-1]*10+c[l%Bt-i];
}
else
A[len-1]=c[6]+10*(c[5]+c[4]*10+c[3]*100+c[2]*1000+c[1]*10000+c[0]*100000);
for(ll i=0;i<len-1;i++)
l=(len-i-1)*Bt+(t==0?Bt:t),A[i]=c[l-1]+c[l-2]*10+c[l-3]*100+c[l-4]*1000+c[l-5]*10000+c[l-6]*100000+c[l-7]*1000000;
}
ll &operator [](ll x){return A[x];}
H operator *(ll a){
H c;
for(ll j=0;j<len;j++)c[j]=A[j]*a;
c.len=len;
for(ll i=0;i<c.len||c[i];i++)
{
c[i+1]+=c[i]/M;
c[i]%=M;
c.len=max(c.len,i+1);
}
return c;
}
void print()
{
printf("%lld",A[len-1]);
for(ll i=len-2;~i;i--)
printf("%07lld",A[i]);
}
};
bool cmp(H a,H b)
{
if(a.len^b.len)return a.len<b.len;
for(ll i=a.len-1;~i;i--)
if(a[i]^b[i])return a[i]<b[i];
return true;
}
struct Q{ll no;H A,ans;bool operator <(Q a){return no<a.no;}};
bool cmp2(Q a,Q b){return cmp(a.A,b.A);}
bool cmp3(Q a,Q b){return a.no<b.no;}
Q S[201];
char c;
int main()
{
// while(true)
// /{
// H A;
// A.get();
// A.print();
// }
for(ll i=2;i<=maxn;i++)
{
if(!check[i])prime[++tot]=i;
ll k,j;
for(k=prime[j=1]*i;k<=maxn;k=prime[++j]*i)
{
check[k]=true;
if(i%prime[j]==0)break;
}
}
ll n;
scanf("%lld",&n);
for(ll i=1;i<=n;i++)
{
S[i].A.get();
S[i].no=i;
}
sort(S+1,S+1+n,cmp2);
H last,no;
last.len=1;
last[0]=1;
no=last;
ll pos=1;
for(ll i=1;i<=n;i++)
{
while(cmp(no,S[i].A))last=no,no=no*prime[pos++];
S[i].ans=last;
}
sort(S+1,S+1+n,cmp3);
for(ll i=1;i<=n;i++)
S[i].ans.print(),putchar('\n');
return 0;
}