#include<bits/stdc++.h> #define int long long using namespace std; const int N=2e5+5,mod=1e9+7; int n,m1,m2; int p[N],s[N]; int f[N],inv[N]; int qpow(int x,int p){ if(!x){ return 1; } int res=1; while(p){ if(p&1){ res=res*x%mod; } x=x*x%mod; p>>=1; } return res; } int C(int n,int m){ if(n<m){ return 1; } return f[n]*inv[m]%mod*inv[n-m]%mod; } int ans; bool vis[N]; signed main(){ scanf("%lld %lld %lld",&n,&m1,&m2); f[0]=inv[0]=1; for(int i=1;i<=n;i++){ f[i]=f[i-1]*i%mod; inv[i]=qpow(f[i],mod-2); } for(int i=1;i<=m1;i++){ scanf("%lld",&p[i]); vis[p[i]]=1; } for(int i=1;i<=m2;i++){ scanf("%lld",&s[i]); vis[s[i]]=1; } if(p[m1]!=s[1]){ printf("0"); return 0; } ans=C(n-1,p[m1]-1); cerr<<ans<<endl; for(int i=1;i<=p[m1];i++){ if(!vis[i]){ ans=ans*(i-1)%mod; } } cerr<<ans<<endl; for(int i=s[1];i<=n;i++){ if(!vis[i]){ ans=ans*(n-i)%mod; } } // for(int i=2;i<p[m1];i++){ // ans=ans*(i-1)%mod; // } // cerr<<ans<<endl; // for(int i=1;i<=m1;i++){ // ans=ans*qpow(p[i]-1,mod-2)%mod; // } // cerr<<ans<<endl; // for(int i=n-1;i>=s[1]-1;i--){ // ans=ans*(n-i)%mod; // } // cerr<<ans<<endl; // for(int i=1;i<=m2;i++){ // ans=ans*qpow(n-s[i]+1,mod-2)%mod; // } printf("%lld",ans); return 0; }
Note.ms
/ppp