#pragma GCC optimize("Ofast") #pragma GCC target("avx2") #define rd_init() char*rp=({char*mmap();mmap(0l,1l<<25,1,2,0,0ll);}) #define rd() ({int _v=0,_c;while(_c=*rp++-48,_c>=0)_v=_v*10+_c;_v;}) #define wt(v) ({unsigned _z=v;do*--wp=_z%10+48;while(_z/=10);}) #define rep(v,e) for(typeof(e)v=0;v=b?a:b) #define MD 1000000007 typedef unsigned long ulong; void sort_aux(unsigned*a,unsigned*b,int n){ int c[256]; for(int i=0;i<256;++i){ c[i]=0; } for(int i=0;i>8|a[i]<<24; } } void sort(unsigned*a,int n){ static unsigned b[100000]; sort_aux(a,b,n); sort_aux(b,a,n); sort_aux(a,b,n); sort_aux(b,a,n); } int h,w; int a[100001]; int b[100001]; char wbuf[64],*wp=wbuf+sizeof wbuf; void f_init(){ rd_init(); h=rd(); w=rd(); rep(i,h){ a[i+1]=rd(); } sort(a+1,h); rep(i,w){ b[i+1]=rd(); } sort(b+1,w); } void f_solve_max(){ ulong z=0; long y=0; rep(i,h){ y+=a[i+1]; } for(int c=h,d=w;b[d];--d){ while(a[c]>b[d]){ y-=a[c--]; } z+=y+(long)b[d]*(h-c); z-=z>=(ulong)MD*MD?(ulong)MD*MD:0; } *--wp='\n'; wt(z%MD); } void f_solve_min(){ ulong z=0; for(int c=h,d=w;a[c]|b[d];){ z+=a[c]>=b[d]?d-=a[c]==b[d],a[c--]:b[d--]; z-=z>=(ulong)MD*MD?(ulong)MD*MD:0; } *--wp='\n'; wt(z%MD); } int main(){ f_init(); f_solve_max(); f_solve_min(); write(1,wp,wbuf+sizeof wbuf-wp); _exit(0); }