#include <bits/stdc++.h>
#define el '\n'
#define fi first
#define sec second
#define pb push_back
#define ll long long
#define pii pair<int,int>
#define sz(v) (int)(v).size()
#define all(v) (v).begin(),(v).end()
#define FOR(i, a, b) for(int i = (a), _b = (b); i <= _b; i++)
#define REP(i, a, b) for(int i = (a), _b = (b); i >= _b; i--)
using namespace std;
const long long LLNF = 0x3f3f3f3f3f3f3f3f ;
const int INF = 0x3f3f3f3f ;
const int MAX_N = 2e5 ;
const int MAX_A = 1e6 ;
vector< int > pos[ MAX_A + 5 ] ; // Lưu vị trí xuất hiện của từng số
pii best[ MAX_A + 5 ] [ 2 ] ; // Mảng best, best[d][0] là tốt nhất, best[d][1] là tốt nhì
int omega[ MAX_A + 5 ] ; // Mảng lưu Ω của từng số
int spf[ MAX_A + 5 ] ; // Mảng spf để phân tích ra thừa số nguyên tố rồi sinh ra các ước
int a[ MAX_N + 5 ] ;
int n;
void Input( ) {
cin >> n;
FOR( i, 1 , n) {
cin >> a[ i] ;
pos[ a[ i] ] .pb ( i) ; // với mỗi số a[i] thì nó xuất hiện ở những vị trí nào
}
}
void Sieve_SPF( int limit) { // Tạo mảng spf
FOR( i, 2 , limit) if ( ! spf[ i] ) {
spf[ i] = i;
for ( ll j = 1LL * i * i; j <= limit; j + = i) {
if ( ! spf[ j] ) spf[ j] = i;
}
}
}
void update_best( int d, pii val) { // hàm update cho mảng best
if ( best[ d] [ 0 ] > val) {
best[ d] [ 1 ] = best[ d] [ 0 ] ;
best[ d] [ 0 ] = val;
}
else if ( best[ d] [ 1 ] > val) {
best[ d] [ 1 ] = val;
}
}
void Prepare( ) {
Sieve_SPF( MAX_A) ;
omega[ 1 ] = 0 ;
FOR( i, 2 , MAX_A) omega[ i] = omega[ i / spf[ i] ] + 1 ; //tính Ω cho từng số
FOR( i, 1 , MAX_A) {
best[ i] [ 0 ] = best[ i] [ 1 ] = { INF, INF} ; // gán trước phòng trước hợp số d không có bội nào tồn tại trong mảng thì kết quả sẽ sau khi dùng công thức sẽ là âm vô cùng -> không ảnh hưởng tới kết quả cuối
for ( int j = i; j <= MAX_A; j + = i) if ( sz( pos[ j] ) ) {
update_best( i, { omega[ j] , pos[ j] [ 0 ] } ) ; // xem số j có phù hợp để làm số tốt nhất cho best[i] không
if ( sz( pos[ j] ) > 1 ) update_best( i, { omega[ j] , pos[ j] [ 1 ] } ) ; // nếu số j xuất hiện 2 lần trong mảng thì cập nhật thêm lần nữa vị biết đâu cả vị trí nhất và nhì thì đều là j nhưng chỉ khác index thì sao
}
}
}
vector< int > get_divisors( int x) { // hàm sinh ước
vector< pii> factor;
while ( x > 1 ) {
int p = spf[ x] , cnt = 0 ;
while ( x % p == 0 ) {
x / = p;
cnt++ ;
}
factor.pb ( { p, cnt} ) ;
}
vector< int > res = { 1 } ;
for ( pii f : factor) {
int p = f.fi , cnt = f.sec ;
int cur = 1 , cur_sz = sz( res) ;
FOR( i, 1 , cnt) {
cur * = p;
for ( int j = 0 ; j < cur_sz; j++ ) res.pb ( res[ j] * cur) ;
}
}
return res;
}
void update_ans( int & best_idx, int & min_dist, int i, int d, pii good) { //nhìn tự hiểu
int dist = omega[ a[ i] ] + good.fi - 2 * omega[ d] ;
if ( min_dist > dist) {
min_dist = dist;
best_idx = good.sec ;
}
else if ( min_dist == dist) {
best_idx = min( best_idx, good.sec ) ;
}
}
void Solve( ) {
FOR( i, 1 , n) {
int best_idx, min_dist = INF;
vector< int > divi = get_divisors( a[ i] ) ; // các ước của a[i]
for ( int d : divi) {
if ( best[ d] [ 0 ] .sec ! = i) update_ans( best_idx, min_dist, i, d, best[ d] [ 0 ] ) ; // nếu số tốt nhất của d không phải là a[i] thì lấy
else update_ans( best_idx, min_dist, i, d, best[ d] [ 1 ] ) ; // còn nếu số tốt nhất chính là a[i] thì dùng số tốt nhì
}
cout << best_idx << " " << min_dist << el; // cout kết quả
}
}
int main( ) {
ios_base:: sync_with_stdio ( 0 ) ;
cin .tie ( 0 ) ;
Input( ) ;
Prepare( ) ;
Solve( ) ;
return 0 ;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CgojZGVmaW5lIGVsICdcbicKI2RlZmluZSBmaSBmaXJzdAojZGVmaW5lIHNlYyBzZWNvbmQKI2RlZmluZSBwYiBwdXNoX2JhY2sKI2RlZmluZSBsbCBsb25nIGxvbmcKI2RlZmluZSBwaWkgcGFpcjxpbnQsaW50PgojZGVmaW5lIHN6KHYpIChpbnQpKHYpLnNpemUoKQojZGVmaW5lIGFsbCh2KSAodikuYmVnaW4oKSwodikuZW5kKCkKI2RlZmluZSBGT1IoaSwgYSwgYikgZm9yKGludCBpID0gKGEpLCBfYiA9IChiKTsgaSA8PSBfYjsgaSsrKQojZGVmaW5lIFJFUChpLCBhLCBiKSBmb3IoaW50IGkgPSAoYSksIF9iID0gKGIpOyBpID49IF9iOyBpLS0pCgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY29uc3QgbG9uZyBsb25nIExMTkYgPSAweDNmM2YzZjNmM2YzZjNmM2Y7CmNvbnN0IGludCBJTkYgPSAweDNmM2YzZjNmOwpjb25zdCBpbnQgTUFYX04gPSAyZTU7CmNvbnN0IGludCBNQVhfQSA9IDFlNjsKCnZlY3RvcjxpbnQ+IHBvc1tNQVhfQSArIDVdOyAvLyBMxrB1IHbhu4sgdHLDrSB4deG6pXQgaGnhu4duIGPhu6dhIHThu6tuZyBz4buRCnBpaSBiZXN0W01BWF9BICsgNV1bMl07IC8vIE3huqNuZyBiZXN0LCBiZXN0W2RdWzBdIGzDoCB04buRdCBuaOG6pXQsIGJlc3RbZF1bMV0gbMOgIHThu5F0IG5ow6wKaW50IG9tZWdhW01BWF9BICsgNV07IC8vIE3huqNuZyBsxrB1IM6pIGPhu6dhIHThu6tuZyBz4buRCmludCBzcGZbTUFYX0EgKyA1XTsgLy8gTeG6o25nIHNwZiDEkeG7gyBwaMOibiB0w61jaCByYSB0aOG7q2Egc+G7kSBuZ3V5w6puIHThu5EgcuG7k2kgc2luaCByYSBjw6FjIMaw4bubYwppbnQgYVtNQVhfTiArIDVdOwppbnQgbjsKCnZvaWQgSW5wdXQoKXsKICAgIGNpbiA+PiBuOwogICAgRk9SKGksIDEsIG4pewogICAgICAgIGNpbiA+PiBhW2ldOwogICAgICAgIHBvc1thW2ldXS5wYihpKTsgLy8gduG7m2kgbeG7l2kgc+G7kSBhW2ldIHRow6wgbsOzIHh14bqldCBoaeG7h24g4bufIG5o4buvbmcgduG7iyB0csOtIG7DoG8KICAgIH0KfQoKdm9pZCBTaWV2ZV9TUEYoaW50IGxpbWl0KXsgLy8gVOG6oW8gbeG6o25nIHNwZgogICAgRk9SKGksIDIsIGxpbWl0KSBpZighc3BmW2ldKXsKICAgICAgICBzcGZbaV0gPSBpOwoKICAgICAgICBmb3IobGwgaiA9IDFMTCAqIGkgKiBpOyBqIDw9IGxpbWl0OyBqICs9IGkpewogICAgICAgICAgICBpZighc3BmW2pdKSBzcGZbal0gPSBpOwogICAgICAgIH0KICAgIH0KfQoKdm9pZCB1cGRhdGVfYmVzdChpbnQgZCwgcGlpIHZhbCl7IC8vIGjDoG0gdXBkYXRlIGNobyBt4bqjbmcgYmVzdAogICAgaWYoYmVzdFtkXVswXSA+IHZhbCl7CiAgICAgICAgYmVzdFtkXVsxXSA9IGJlc3RbZF1bMF07CiAgICAgICAgYmVzdFtkXVswXSA9IHZhbDsKICAgIH0KICAgIGVsc2UgaWYoYmVzdFtkXVsxXSA+IHZhbCl7CiAgICAgICAgYmVzdFtkXVsxXSA9IHZhbDsKICAgIH0KfQoKdm9pZCBQcmVwYXJlKCl7CiAgICBTaWV2ZV9TUEYoTUFYX0EpOwoKICAgIG9tZWdhWzFdID0gMDsKICAgIEZPUihpLCAyLCBNQVhfQSkgb21lZ2FbaV0gPSBvbWVnYVtpIC8gc3BmW2ldXSArIDE7IC8vdMOtbmggzqkgY2hvIHThu6tuZyBz4buRCgogICAgRk9SKGksIDEsIE1BWF9BKXsKICAgICAgICBiZXN0W2ldWzBdID0gYmVzdFtpXVsxXSA9IHtJTkYsIElORn07IC8vIGfDoW4gdHLGsOG7m2MgcGjDsm5nIHRyxrDhu5tjIGjhu6NwIHPhu5EgZCBraMO0bmcgY8OzIGLhu5lpIG7DoG8gdOG7k24gdOG6oWkgdHJvbmcgbeG6o25nIHRow6wga+G6v3QgcXXhuqMgc+G6vSBzYXUga2hpIGTDuW5nIGPDtG5nIHRo4bupYyBz4bq9IGzDoCDDom0gdsO0IGPDuW5nIC0+IGtow7RuZyDhuqNuaCBoxrDhu59uZyB04bubaSBr4bq/dCBxdeG6oyBjdeG7kWkKCiAgICAgICAgZm9yKGludCBqID0gaTsgaiA8PSBNQVhfQTsgaiArPSBpKSBpZihzeihwb3Nbal0pKXsKICAgICAgICAgICAgICAgIHVwZGF0ZV9iZXN0KGksIHtvbWVnYVtqXSwgcG9zW2pdWzBdfSk7IC8vIHhlbSBz4buRIGogY8OzIHBow7kgaOG7o3AgxJHhu4MgbMOgbSBz4buRIHThu5F0IG5o4bqldCBjaG8gYmVzdFtpXSBraMO0bmcKICAgICAgICAgICAgICAgIGlmKHN6KHBvc1tqXSkgPiAxKSB1cGRhdGVfYmVzdChpLCB7b21lZ2Fbal0sIHBvc1tqXVsxXX0pOy8vIG7hur91IHPhu5EgaiB4deG6pXQgaGnhu4duIDIgbOG6p24gdHJvbmcgbeG6o25nIHRow6wgY+G6rXAgbmjhuq10IHRow6ptIGzhuqduIG7hu69hIHbhu4sgYmnhur90IMSRw6J1IGPhuqMgduG7iyB0csOtIG5o4bqldCB2w6AgbmjDrCB0aMOsIMSR4buBdSBsw6AgaiBuaMawbmcgY2jhu4kga2jDoWMgaW5kZXggdGjDrCBzYW8KCiAgICAgICAgfQogICAgfQp9Cgp2ZWN0b3I8aW50PiBnZXRfZGl2aXNvcnMoaW50IHgpeyAvLyBow6BtIHNpbmggxrDhu5tjCiAgICB2ZWN0b3I8cGlpPiBmYWN0b3I7CgogICAgd2hpbGUoeCA+IDEpewogICAgICAgIGludCBwID0gc3BmW3hdLCBjbnQgPSAwOwogICAgICAgIHdoaWxlKHggJSBwID09IDApewogICAgICAgICAgICB4IC89IHA7CiAgICAgICAgICAgIGNudCsrOwogICAgICAgIH0KICAgICAgICBmYWN0b3IucGIoe3AsIGNudH0pOwogICAgfQoKICAgIHZlY3RvcjxpbnQ+IHJlcyA9IHsxfTsKICAgIGZvcihwaWkgZiA6IGZhY3Rvcil7CiAgICAgICAgaW50IHAgPSBmLmZpLCBjbnQgPSBmLnNlYzsKICAgICAgICBpbnQgY3VyID0gMSwgY3VyX3N6ID0gc3oocmVzKTsKCiAgICAgICAgRk9SKGksIDEsIGNudCl7CiAgICAgICAgICAgIGN1ciAqPSBwOwogICAgICAgICAgICBmb3IoaW50IGogPSAwOyBqIDwgY3VyX3N6OyBqKyspIHJlcy5wYihyZXNbal0gKiBjdXIpOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gcmVzOwp9Cgp2b2lkIHVwZGF0ZV9hbnMoaW50ICZiZXN0X2lkeCwgaW50ICZtaW5fZGlzdCwgaW50IGksIGludCBkLCBwaWkgZ29vZCl7IC8vbmjDrG4gdOG7sSBoaeG7g3UKICAgIGludCBkaXN0ID0gb21lZ2FbYVtpXV0gKyBnb29kLmZpIC0gMiAqIG9tZWdhW2RdOwoKICAgIGlmKG1pbl9kaXN0ID4gZGlzdCl7CiAgICAgICAgbWluX2Rpc3QgPSBkaXN0OwogICAgICAgIGJlc3RfaWR4ID0gZ29vZC5zZWM7CiAgICB9CiAgICBlbHNlIGlmKG1pbl9kaXN0ID09IGRpc3QpewogICAgICAgIGJlc3RfaWR4ID0gbWluKGJlc3RfaWR4LCBnb29kLnNlYyk7CiAgICB9Cn0KCnZvaWQgU29sdmUoKXsKICAgIEZPUihpLCAxLCBuKXsKICAgICAgICBpbnQgYmVzdF9pZHgsIG1pbl9kaXN0ID0gSU5GOwoKICAgICAgICB2ZWN0b3I8aW50PiBkaXZpID0gZ2V0X2Rpdmlzb3JzKGFbaV0pOyAvLyBjw6FjIMaw4bubYyBj4bunYSBhW2ldCiAgICAgICAgZm9yKGludCBkIDogZGl2aSl7CiAgICAgICAgICAgIGlmKGJlc3RbZF1bMF0uc2VjICE9IGkpIHVwZGF0ZV9hbnMoYmVzdF9pZHgsIG1pbl9kaXN0LCBpLCBkLCBiZXN0W2RdWzBdKTsgLy8gbuG6v3Ugc+G7kSB04buRdCBuaOG6pXQgY+G7p2EgZCBraMO0bmcgcGjhuqNpIGzDoCBhW2ldIHRow6wgbOG6pXkKICAgICAgICAgICAgZWxzZSB1cGRhdGVfYW5zKGJlc3RfaWR4LCBtaW5fZGlzdCwgaSwgZCwgYmVzdFtkXVsxXSk7IC8vIGPDsm4gbuG6v3Ugc+G7kSB04buRdCBuaOG6pXQgY2jDrW5oIGzDoCBhW2ldIHRow6wgZMO5bmcgc+G7kSB04buRdCBuaMOsCiAgICAgICAgfQoKICAgICAgICBjb3V0IDw8IGJlc3RfaWR4IDw8ICIgIiA8PCBtaW5fZGlzdCA8PCBlbDsgLy8gY291dCBr4bq/dCBxdeG6owogICAgfQp9CgppbnQgbWFpbigpewogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbygwKTsKICAgIGNpbi50aWUoMCk7CgogICAgSW5wdXQoKTsKICAgIFByZXBhcmUoKTsKICAgIFNvbHZlKCk7CgogICAgcmV0dXJuIDA7Cn0K