/*
knowing lcm(x, y) = x * y / gcd(x, y)
then we can calculate the answer for pairs with common gcd easily using modified sieve
we have only one problem that we will calculate the answer for some pairs more than one time,
so we need to exclude ans of multiples of our gcd so far.
almost the same idea could be found here codeforces.com/blog/entry/62621?#comment-465836
*/
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 55 , mod = 1e9 + 7 ;
int t, n, x, freq[ N] ;
long long ans[ N] ;
int pw( long long x, int b) {
if ( ! b) return 1 ;
if ( b& 1 ) return ( x * pw( x, b - 1 ) ) % mod;
return pw( ( x * x) % mod, b / 2 ) ;
}
int modinv( int x) {
return pw( x, mod - 2 ) ;
}
int solve( ) {
long long res = 0 ;
for ( int i = N - 1 ; i; -- i) {
vector< int > v;
long long sm = 0 ;
for ( int j = i; j < N; j + = i) {
ans[ i] - = ans[ j] ;
for ( int x = 0 ; x < freq[ j] ; ++ x) {
v.push_back ( j) ;
sm + = j;
}
}
for ( int x: v) {
//sm -= x;
ans[ i] = ( ans[ i] + sm * x) % mod;
}
res = ( res + ans[ i] * modinv( i) ) % mod;
}
return res;
}
int main( ) {
ios:: sync_with_stdio ( 0 ) ; cin .tie ( 0 ) ;
freopen ( "lcm.in" , "r" , stdin ) ;
cin >> t;
while ( t-- ) {
cin >> n;
memset ( freq, 0 , sizeof ( freq) ) ;
memset ( ans, 0 , sizeof ( ans) ) ;
for ( int i = 0 ; i < n; ++ i) {
cin >> x;
++ freq[ x] ;
}
cout << solve( ) << '\n ' ;
}
return 0 ;
}
LyoKCWtub3dpbmcgbGNtKHgsIHkpID0geCAqIHkgLyBnY2QoeCwgeSkKCXRoZW4gd2UgY2FuIGNhbGN1bGF0ZSB0aGUgYW5zd2VyIGZvciBwYWlycyB3aXRoIGNvbW1vbiBnY2QgZWFzaWx5IHVzaW5nIG1vZGlmaWVkIHNpZXZlCgl3ZSBoYXZlIG9ubHkgb25lIHByb2JsZW0gdGhhdCB3ZSB3aWxsIGNhbGN1bGF0ZSB0aGUgYW5zd2VyIGZvciBzb21lIHBhaXJzIG1vcmUgdGhhbiBvbmUgdGltZSwKCXNvIHdlIG5lZWQgdG8gZXhjbHVkZSBhbnMgb2YgbXVsdGlwbGVzIG9mIG91ciBnY2Qgc28gZmFyLgoJYWxtb3N0IHRoZSBzYW1lIGlkZWEgY291bGQgYmUgZm91bmQgaGVyZSBjb2RlZm9yY2VzLmNvbS9ibG9nL2VudHJ5LzYyNjIxPyNjb21tZW50LTQ2NTgzNgoqLwojaW5jbHVkZSA8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNvbnN0IGludCBOID0gMWU1ICsgNTUsIG1vZCA9IDFlOSArIDc7CmludCB0LCBuLCB4LCBmcmVxW05dOwpsb25nIGxvbmcgYW5zW05dOwppbnQgcHcobG9uZyBsb25nIHgsIGludCBiKXsKICAgIGlmKCFiKSByZXR1cm4gMTsKICAgIGlmKGImMSkgcmV0dXJuICh4ICogcHcoeCwgYiAtIDEpKSAlIG1vZDsKICAgIHJldHVybiBwdygoeCAqIHgpICUgbW9kLCBiIC8gMik7Cn0KaW50IG1vZGludihpbnQgeCl7CiAgICByZXR1cm4gcHcoeCwgbW9kIC0gMik7Cn0KaW50IHNvbHZlKCl7CiAgICBsb25nIGxvbmcgcmVzID0gMDsKICAgIGZvcihpbnQgaSA9IE4gLSAxOyBpOyAtLWkpewogICAgICAgIHZlY3RvcjxpbnQ+IHY7CiAgICAgICAgbG9uZyBsb25nIHNtID0gMDsKICAgICAgICBmb3IoaW50IGogPSBpOyBqIDwgTjsgaiArPSBpKXsKICAgICAgICAgICAgYW5zW2ldIC09IGFuc1tqXTsKICAgICAgICAgICAgZm9yKGludCB4ID0gMDsgeCA8IGZyZXFbal07ICsreCl7CiAgICAgICAgICAgICAgICB2LnB1c2hfYmFjayhqKTsKICAgICAgICAgICAgICAgIHNtICs9IGo7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgZm9yKGludCB4OiB2KXsKICAgICAgICAgICAgLy9zbSAtPSB4OwogICAgICAgICAgICBhbnNbaV0gPSAoYW5zW2ldICsgc20gKiB4KSAlIG1vZDsKICAgICAgICB9CiAgICAgICAgcmVzID0gKHJlcyArIGFuc1tpXSAqIG1vZGludihpKSkgJSBtb2Q7CiAgICB9CiAgICByZXR1cm4gcmVzOwp9CmludCBtYWluKCl7CiAgICBpb3M6OnN5bmNfd2l0aF9zdGRpbygwKTsgY2luLnRpZSgwKTsKICAgIGZyZW9wZW4oImxjbS5pbiIsICJyIiwgc3RkaW4pOwogICAgY2luID4+IHQ7CiAgICB3aGlsZSh0LS0pewogICAgICAgIGNpbiA+PiBuOwogICAgICAgIG1lbXNldChmcmVxLCAwLCBzaXplb2YoZnJlcSkpOwogICAgICAgIG1lbXNldChhbnMsIDAsIHNpemVvZihhbnMpKTsKICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgbjsgKytpKXsKICAgICAgICAgICAgY2luID4+IHg7CiAgICAgICAgICAgICsrZnJlcVt4XTsKICAgICAgICB9CiAgICAgICAgY291dCA8PCBzb2x2ZSgpIDw8ICdcbic7CiAgICB9CiAgICByZXR1cm4gMDsKfQ==