题目链接
题意:给出两个长度为nn的点对(a1,1),(a2,2),…,(an,n)和(b1,1),(b2,2),…,(bn,n),要求用这两个序列构成一个长度为2n的点对序列,使得x坐标非减,问方案数
思路:答案为IIcntx/pow(2,num),其实cnt是每个数的个数,num为a【i】==b【i】的对数
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+1;
ll m,ans=1,cnt,a[maxn],b[maxn];
map<ll,ll>p;
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;++i) scanf("%lld",&a[i]),p[a[i]]++;
for(int i=1;i<=n;++i){
scanf("%lld",&b[i]);
if(a[i]==b[i]) cnt++;
p[b[i]]++;
}
scanf("%lld",&m);
for(auto i:p)
{
for(int j=1;j<=i.second;++j)
{
ll t=j;
while(cnt>0&&t%2==0) t/=2,cnt--;
ans=ans*t%m;
}
}
printf("%lld\n",ans%m);
}