#include <bits/stdc++.h> using namespace std; using u32 = unsigned; using u64 = unsigned long long; constexpr int N = 2010; constexpr u32 mod = 1e9 + 7; int n, v[N]; u32 a[N][N]; inline int fpw(int a, int b) { int ans = 1; for(; b; b >>= 1, a = 1ll * a * a % mod) if(b & 1) ans = 1ll * ans * a % mod; return ans; } int det() { int ans = 1; for(int i = 1; i <= n; i ++) { int p = -1; for(int j = i; j <= n; j ++) if(a[j][i]) p = j; if(p != i) { swap(a[p], a[i]); ans = mod - ans; } int inv = fpw(a[i][i], mod - 2); for(int j = i + 1; j <= n; j ++) { const u64 d = mod - 1ll * a[j][i] * inv % mod; for(int k = i; k <= n; k ++) { a[j][k] = (a[j][k] + d * a[i][k]) % mod; } } ans = 1ll * ans * a[i][i] % mod; } return ans; } int main() { // freopen("in.txt", "r", stdin); ios::sync_with_stdio(false), cin.tie(0); cin >> n; for(int i = 1; i <= n; i ++) cin >> v[i]; for(int i = 1; i <= n; i ++) { for(int j = i + 1; j <= n; j ++) { int w = __gcd(v[i], v[j]); a[i][j] = a[j][i] = mod - w; a[i][i] = (a[i][i] + w) % mod; a[j][j] = (a[j][j] + w) % mod; } } n --; cout << det() << '\n'; return 0; }
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 | #include <bits/stdc++.h> using namespace std; using u32 = unsigned; using u64 = unsigned long long; constexpr int N = 2010; constexpr u32 mod = 1e9 + 7; int n, v[N]; u32 a[N][N]; inline int fpw(int a, int b) { int ans = 1; for(; b; b >>= 1, a = 1ll * a * a % mod) if(b & 1) ans = 1ll * ans * a % mod; return ans; } int det() { int ans = 1; for(int i = 1; i <= n; i ++) { int p = -1; for(int j = i; j <= n; j ++) if(a[j][i]) p = j; if(p != i) { swap(a[p], a[i]); ans = mod - ans; } int inv = fpw(a[i][i], mod - 2); for(int j = i + 1; j <= n; j ++) { const u64 d = mod - 1ll * a[j][i] * inv % mod; for(int k = i; k <= n; k ++) { a[j][k] = (a[j][k] + d * a[i][k]) % mod; } } ans = 1ll * ans * a[i][i] % mod; } return ans; } int main() { // freopen("in.txt", "r", stdin); ios::sync_with_stdio(false), cin.tie(0); cin >> n; for(int i = 1; i <= n; i ++) cin >> v[i]; for(int i = 1; i <= n; i ++) { for(int j = i + 1; j <= n; j ++) { int w = __gcd(v[i], v[j]); a[i][j] = a[j][i] = mod - w; a[i][i] = (a[i][i] + w) % mod; a[j][j] = (a[j][j] + w) % mod; } } n --; cout << det() << '\n'; return 0; } |