题解:
A.突破口:已知老大的value,求出保证老大最大的其他boy能选择的女孩个数。
小A->2 小B->4 小C->5 方法总数怎么求? 先放少的保证后面一定有的放。2*(4-1)*(5-2)方法种数。
排序过后:先求出来的种数一定多就有规律可循了。
#include<bits/stdc++.h>
using namespace std;
#define rep(a,b) for(int i=a;i<=b;i++)
#define red(a,b) for(int i=a;i>=b;i--)
#define ULL unsigned long long
#define LL long long
const LL MOD = 1e9+7;
LL boy[20000];
LL girl[20000];
LL ans=0;
vector<LL>v;
int main()
{
int n;cin>>n;
rep(1,n)cin>>boy[i];
rep(1,n)cin>>girl[i];
LL base=boy[1];
sort(boy+1+1,boy+1+1+n-1);
sort(girl+1,girl+1+n);
/*for(int i=2;i<=n;i++)
cout<<boy[i]<<" ";
cout<<endl;
for(int i=1;i<=n;i++)
cout<<girl[i]<<" ";
cout<<endl;*/
for(int i=1;i<=n;i++)
{
LL temp=base*girl[i];
LL p=1;
for(int j=2;j<=n;j++)
{
LL q=0;
for(int k=1;k<=n;k++)
if(girl[k]*boy[j]<temp&&k!=i)q++;
//cout<<boy[j]<<" "<<q<<endl;
if(q-(n-j)>0)
p=(p*(q-(n-j)))%MOD;
else p=0;
}
ans=(ans+p)%MOD;
}
cout<<ans<<endl;
system("pause");
}