//GRT_2018
#include <bits/stdc++.h>
#define PB push_back
#define ST first
#define ND second
//mt19937 rng(chrono::high_resolution_clock::now().time_since_epoch().count());
using namespace std;
using ll = long long;
using pi = pair<int,int>;
using vi = vector<int>;
const int nax = 5000 + 10, mod = 1e9 + 7;
int n;
int val[nax];
int m[nax][nax];
int fastpow(int a, int b) {
int w = 1;
while (b) {
if (b & 1) w = ((ll)w * a) % mod;
b >>= 1;
a = ((ll)a * a) % mod;
}
return w;
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> n;
for (int i = 0; i < n; ++i) {
cin >> val[i];
}
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
if (i == j) {
for (int k = 0; k < n; ++k) {
if (k == i) continue;
m[i][i] += gcd(val[i], val[k]);
}
} else {
m[i][j] = -gcd(val[i], val[j]);
}
}
}
n--;
int row = 0, col = 0;
int par = 0;
while (row < n && col < n) {
int id = -1;
for (int i = row; i < n; ++i) {
if (m[i][col] != 0) {
id = i;
}
}
if (id == -1) {
col++;
continue;
}
if (row != id) {
for (int i = col; i < n; ++i) {
swap(m[row][i], m[id][i]);
}
par ^= 1;
}
int inv = fastpow(m[row][col], mod - 2);
for (int i = row + 1; i < n; ++i) {
if (m[i][col] == 0) continue;
ll mul = ((ll)inv * m[i][col]) % mod;
for (int j = col; j < n; ++j) {
m[i][j] = (m[i][j] - (ll)mul * m[row][j]) % mod;
}
}
row++;
}
ll det = 1;
for (int i = 0; i < n; ++i) {
det = (det * m[i][i]) % mod;
}
if (par & 1) det = -det;
if (det < 0) det += mod;
cout << det;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | //GRT_2018 #include <bits/stdc++.h> #define PB push_back #define ST first #define ND second //mt19937 rng(chrono::high_resolution_clock::now().time_since_epoch().count()); using namespace std; using ll = long long; using pi = pair<int,int>; using vi = vector<int>; const int nax = 5000 + 10, mod = 1e9 + 7; int n; int val[nax]; int m[nax][nax]; int fastpow(int a, int b) { int w = 1; while (b) { if (b & 1) w = ((ll)w * a) % mod; b >>= 1; a = ((ll)a * a) % mod; } return w; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> n; for (int i = 0; i < n; ++i) { cin >> val[i]; } for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { if (i == j) { for (int k = 0; k < n; ++k) { if (k == i) continue; m[i][i] += gcd(val[i], val[k]); } } else { m[i][j] = -gcd(val[i], val[j]); } } } n--; int row = 0, col = 0; int par = 0; while (row < n && col < n) { int id = -1; for (int i = row; i < n; ++i) { if (m[i][col] != 0) { id = i; } } if (id == -1) { col++; continue; } if (row != id) { for (int i = col; i < n; ++i) { swap(m[row][i], m[id][i]); } par ^= 1; } int inv = fastpow(m[row][col], mod - 2); for (int i = row + 1; i < n; ++i) { if (m[i][col] == 0) continue; ll mul = ((ll)inv * m[i][col]) % mod; for (int j = col; j < n; ++j) { m[i][j] = (m[i][j] - (ll)mul * m[row][j]) % mod; } } row++; } ll det = 1; for (int i = 0; i < n; ++i) { det = (det * m[i][i]) % mod; } if (par & 1) det = -det; if (det < 0) det += mod; cout << det; } |
English