#include<iostream>
#include<algorithm>
using namespace std;
const int N(100005),M(99999997);
struct node{
	int data,no;
	bool operator <(const node &x)const
	{
		return data<x.data;
	}
};
int a[N],b[N],c[N],tmp[N];
node t[N];
int merge(int low,int mid,int high)
{
	int i,j,k,t(0);
	for (i=low,j=mid+1,k=low;i<=mid&&j<=high;)
		if (c[i]<c[j])
			tmp[k++]=c[i++];
		else tmp[k++]=c[j++],t=(t+mid+1-i)%M;
	while (i<=mid) tmp[k++]=c[i++];
	while (j<=high)tmp[k++]=c[j++];
	for (i=low;i<=high;i++) c[i]=tmp[i];
	return t;
}
int solve(int low,int high)
{
	if (low>=high) return 0;
	int mid,t(0);
	mid=(low+high)/2;
	t=(t+solve(low,mid))%M;
	t=(t+solve(mid+1,high))%M;
	t=(t+merge(low,mid,high)%M);
	return t;
}

int main()
{
	//ifstream cin("match.in");
	//ofstream cout("match.out");
	int n;
	cin>>n;
	for (int i=1;i<=n;i++) {
		cin>>a[i];
		t[i].data=a[i];  t[i].no=i;
	}
	sort(t+1,t+n+1);	
	for (int i=1;i<=n;i++) a[i]=t[i].no;
	for (int i=1;i<=n;i++) {
		cin>>b[i];
		t[i].data=b[i];  t[i].no=i;
	}
	sort(t+1,t+n+1);
	for (int i=1;i<=n;i++) b[t[i].no]=i;
	for (int i=1;i<=n;i++) c[i]=a[b[i]];
	cout<<solve(1,n)<<endl;
	return 0;
}
/**************************************************************
	Problem: 2325
	User: admin
	Language: C++
	Result: Accepted
	Time:177 ms
	Memory:4420 kb
****************************************************************/