#include <cstdio> #include <algorithm> #include <vector> #include <cstring> #include <numeric> #include <cassert> #include <cmath> using namespace std; typedef unsigned int uint; #define FOR(k,a,b) for(uint k(a); k < (b); ++k) #define REP(k,a) for(uint k=0; k < (a); ++k) uint MOD = 1e9+7; double EPS = 1e-9; uint inverse(uint a) { uint pow = MOD - 2; unsigned long long act = a , res = 1; while( pow ) { if(pow&1) { res *= act; res %= MOD; } act *= act; act %= MOD; pow >>= 1; } return res; } double add(double a, double b) { double t = log10(b); int z = t; t -= z; a += t; z = a; a -= z; return a; } double sub(double a, double b) { double t = log10(b); int z = t; t -= z + 1; a -= t; z = a; a -= z; return a; } int main (int argc, char** argv) { #ifdef HOME freopen("in.txt","rb",stdin); freopen("out.txt","wb",stdout); #endif uint N, Q, type, pos, newv, oldv; vector<uint> A, prod; vector<double> lsum; scanf("%u",&N); A.resize(N); uint NN = sqrt((double)N)+1; uint NNN = min<uint>(10,NN); prod.resize(NN, MOD); lsum.resize(NN); REP(i,N) { scanf("%u",&A[i]); } scanf("%u",&Q); int ctr = 0; REP(i,Q) { scanf("%u",&type); if(type == 1) {//update scanf("%d %d",&pos, &newv); pos--; oldv = A[pos]; if(pos>=NNN) { FOR(i,1,NN) if(pos == 0 || ( pos % i == 0)) { if(prod[i] == MOD) {//init // prod[i] = A[0]; // lsum[i] = add(0, A[0]); prod[i] = 1; lsum[i] = 0; for (uint j = i; j<N; j+=i) if(j>=NNN) { prod[i] = ((unsigned long long)(prod[i]) * A[j]) % MOD; lsum[i] = add(lsum[i], A[j]); } } //update unsigned long long tmp = inverse(oldv); tmp *= newv; tmp %= MOD; prod[i] = (prod[i] * tmp) %MOD; lsum[i] = sub(lsum[i], oldv); lsum[i] = add(lsum[i], newv); } } A[pos] = newv; } else {//query scanf("%d",&pos); unsigned long long res = 1; double resd = 0; if(pos >= NN) { for (uint j = 0; j<N; j+=pos) { res = (res * A[j]) % MOD; resd = add(resd, A[j]); } } else if( prod[pos] != MOD) { res = prod[pos]; resd = lsum[pos]; REP(i,NNN) if(i%pos==0) { res = (res * A[i]) % MOD; resd = add(resd, A[i]); } } else { prod[pos] = 1; lsum[pos] = 0; for (uint j = 0; j<N; j+=pos) if(j>=NNN) { prod[pos] = ((unsigned long long)(prod[pos]) * A[j]) % MOD; lsum[pos] = add(lsum[pos], A[j]); } res = prod[pos]; resd = lsum[pos]; REP(i,NNN) if(i%pos==0) { res = (res * A[i]) % MOD; resd = add(resd, A[i]); } } int firstd = pow(10.0, resd + EPS); printf("%d %lld\n",firstd,res); } } return 0; }