#include using namespace std; //HEADER START int solve(int, int, vector>); //HEADER END const int MAXM = 1e5 + 10, MAXN = 21, M = 1e9 + 7; int cnt[MAXN][MAXM], dp[MAXM], curCnt[MAXN]; int solve(int n, int m, vector> a) { for(int i = 0; i < n; i++) { for(auto x : a[i]) { cnt[i][x]++; } } int total = 0; for(int i = MAXM - 1; i > 0; i--) { for(int l = 0; l < n; l++) { curCnt[l] = 0; for(int j = i; j < MAXM; j += i) { curCnt[l] += cnt[l][j]; } } dp[i] = 1; for(int j = 0; j < n; j++) { dp[i] = dp[i] * 1ll * (curCnt[j] + 1) % M; } for(int j = 0; j < n; j++) { dp[i] = (dp[i] + M - curCnt[j]) % M; } dp[i] = (dp[i] + M - 1) % M; for(int j = 2 * i; j < MAXM; j += i) { dp[i] = (dp[i] + M - dp[j]) % M; } total = (total + dp[i] * 1ll * i % M) % M; } return total; } //GRADER START int main() { int n, m; scanf("%d%d", &n, &m); vector> a(n, vector(m)); for(int i = 0; i < n; i++) { for(int j = 0; j < m; j++) { scanf("%d", &a[i][j]); } } cout << solve(n, m, a) << endl; } //GRADER END