#include using namespace std; const int MAX = 100001; const int LN = 21; const int MOD = 1e9 + 7; inline int add(int a, int b) { int r = a + b; return (r >= MOD ? r - MOD : r); } inline int sub(int a, int b) { int r = a - b; return (r < 0 ? r + MOD : r); } inline int mul(int a, int b) { long long r = (long long)a * b; return (r >= MOD ? r % MOD : r); } int n, m; int a[MAX]; int b[MAX]; int freq[LN][MAX]; vector divs[MAX]; void init() { for(int i = 1; i < MAX; ++i) { for(int j = 2*i; j < MAX; j += i) { divs[j].push_back(i); } } } void update(int x) { for(int i = 1; i <= n; ++i) { for(int f : divs[x]) { freq[i][f] = add(freq[i][f], freq[i][x]); } } } void calc() { for(int x = 1; x < MAX; ++x) { int u = mul(freq[n][x], freq[n-1][x]); int v = add(u, add(freq[n][x], freq[n-1][x])); for(int i = n-2; i >= 1; --i) { u = add(u, mul(v, freq[i][x])); v = add(mul(v, freq[i][x] + 1), freq[i][x]); } a[x] = u; } } int main() { ios_base::sync_with_stdio(false); init(); int x; cin >> n >> m; for(int i = 1; i <= n; ++i) { for(int j = 1; j <= m; ++j) { cin >> x; freq[i][x] += 1; } } for(int i = 1; i < MAX; ++i) { update(i); } calc(); int ans = 0; for(int x = MAX - 1; x >= 1; --x) { int v = a[x]; for(int j = 2*x; j < MAX; j += x) { v = sub(v, b[j]); } b[x] = v; ans = add(ans, mul(v, x)); } cout << ans << "\n"; return 0; }