#include #include using namespace std; unsigned long long max(unsigned long long a, unsigned long long b) { if(a > b) return a; return b; } unsigned long long gcd(unsigned long long a, unsigned long long b) { // return 0; unsigned long long maks = max(a,b); unsigned long long mini = min(a,b); unsigned long long tmp = maks; // while(mini != 0){ // tmp = mini; // mini = maks - mini; // maks = tmp; // } while(maks != mini) { tmp = mini; mini = maks % mini; if(mini==0){ return tmp; } maks = tmp; if(mini == 1) break; } return mini; } int main() { ios_base::sync_with_stdio(false); // cout<> n; vector tab; for(int i = 0; i < n; i++) { cin >> a; tab.push_back(a); } vector> tab1(2, vector(n, 0)); vector> tab2(2, vector(n, 0)); tab1[0] = tab; tab2[0] = tab; unsigned long long sum = 0; for(int i = 0; i < n; i++) { sum += ((tab[i] * tab[i])); sum %= 1000000007; } int n_tmp = n - 1; for(int k = 1; k < n; k++) { for(int i = 0; i < n_tmp; i++) { tab1[k % 2][i] = max(tab1[(k - 1) % 2][i], tab1[(k - 1) % 2][i + 1]) % 1000000007; tab2[k % 2][i] = gcd(tab2[(k - 1) % 2][i], tab2[(k - 1) % 2][i + 1]) % 1000000007; sum += ( tab1[k % 2 ][i] * tab2[k % 2][i] ) ; sum %= 1000000007; } n_tmp--; } cout << sum << endl; return 0; }