#include using namespace std; #define PB push_back #define ZERO (1e-10) #define INF int(1e9+1) #define CL(A,I) (memset(A,I,sizeof(A))) #define DEB printf("DEB!\n"); #define D(X) cout<<" "<<#X": "<B&&A-ZERO pll; typedef vector vi; typedef pair ii; typedef vector vii; #define IN(n) int n;scanf("%d",&n); #define FOR(i, m, n) for (int i(m); i < n; i++) #define F(n) FOR(i,0,n) #define FF(n) FOR(j,0,n) #define FT(m, n) FOR(k, m, n) #define aa first #define bb second void ga(int N,int *A){F(N)scanf("%d",A+i);} #define LG (18) #define MX (1<A[dp[i+(1<<(k-1))][k-1]]) dp[i][k]=dp[i][k-1]; else dp[i][k]=dp[i+(1<<(k-1))][k-1]; } int qy(int *A,int L,int R){ int j(G[R-L+1]); if(A[dp[L][j]]>=A[dp[R-(1<>1))B=M; else E=M-1; while(!ok(E))--E; return E; } int BS(int B,int E){ int M; while(B>1))E=M; else B=M+1; return E; } vi X,Y; #define DF(B,E) (max(B,E)-min(B,E)) int go(int b,int e){ if(b>e)return 0; x=b-1,y=e+1; I=R.qy(A,b,e); int S=0,J=I,F=I; X.clear(),Y.clear(); X.PB(I-1),Y.PB(I+1); while(J<=e)g=G.qy(I,J),J=BS(J,e+1),X.PB(J-1); J=I; while(J>=b)g=G.qy(J,I),J=bs(b-1,J),Y.PB(J+1); FT(1,(int)X.size())FOR(i,1,(int)Y.size()) S=(S+ll(A[I])*__gcd(G.qy(I,X[k]),G.qy(Y[i],I))%MOD*DF(X[k],X[k-1])%MOD*DF(Y[i],Y[i-1]))%MOD; return (ll(S)+go(b,F-1)+go(F+1,e))%MOD; } int main(void){ scanf("%d",&N),ga(N,A),R.ini(A,N),G.ini(A,N); printf("%d\n",go(0,N-1)); return 0; }