voidsolve(){ cin >> n; for(int i = 1 ; i <= n ; i ++)cin >> c[i]; poly a = work(1 , n); poly b = a.der(); b = -b * a.inv(); b.resize(n + 1); ull res = 0; for(int i = 0 ; i < n ; i ++)res ^= b[i]; cout << res << endl; }
int a[S] , n; poly h; int g[S] , md[S]; int fact[S] , infact[N]; int fmx[S] , smx[S]; int inv[S]; int f[S];
intqmi(int a , int b){ int res = 1; while(b){ if(b & 1)res = res * a % mod; a = a * a % mod; b >>= 1; } return res; }
intinit(){ inv[0] = 1 , inv[1] = 1; for(int i = 1 ; i <= MXN ; i ++)inv[i] = qmi(i , mod - 2); md[1] = 1; for(int i = 2 ; i <= MXN ; i ++){ if(md[i])continue; for(int j = i ; j <= MXN ; j += i){ md[j] = i; } } for(int i = 1 ; i <= n ; i ++){ int cur = a[i]; while(cur > 1){ int p = md[cur] , s = 1; while(md[cur] == p)s *= p , cur /= p; if(s > fmx[p])swap(fmx[p] , s); if(s > smx[p])swap(smx[p] , s); } } int lc = 1; for(int i = 1 ; i <= MXN ; i ++)if(fmx[i])lc = lc * fmx[i] % mod; for(int i = 1 ; i <= n ; i ++){ int cur = a[i] , t = lc; while(cur > 1){ int p = md[cur] , s = 1; while(p == md[cur])s *= p , cur /= p; if(s > smx[p])t = t * inv[s] % mod * max(1ll , smx[p]) % mod; } f[i] = t; } for(int i = 1 ; i <= MXN ; i ++){ int cur = i , t = lc; while(cur > 1){ int p = md[cur] , s = 1; while(p == md[cur])s *= p , cur /= p; if(s > fmx[p])t = t * inv[fmx[p]] % mod * s % mod; } g[i] = t; } return lc; }
// const int M = 1e6;
signedmain(){ cin >> n; for(int i = 1 ; i <= n ; i ++)cin >> a[i]; init_poly(MXN); int lc = init(); for(int i = 1 ; i <= n ; i ++)h[a[i]] = (h[a[i]] + f[i]) % mod; h = h * h; int res = 0; for(int i = 1 ; i <= n ; i ++)h[a[i] + a[i]] = ((h[a[i] + a[i]] - f[i] * f[i] % mod) % mod + mod) % mod; for(int i = 1 ; i <= MXN ; i ++){ res = (res + h[i] * g[i] % mod) % mod; } lc = lc * lc % mod; lc = qmi(lc , mod - 2); cout << res * lc % mod * inv[2] % mod << endl; return0; }