Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- int main(){
- ios_base::sync_with_stdio(false);
- cin.tie(NULL);
- int n,p;
- cin>>n>>p;
- vector<int> s(n),t(n);
- for(auto &x:s)cin>>x;
- for(auto &x:t)cin>>x;
- sort(s.begin(),s.end());
- sort(t.begin(),t.end());
- const int N = 50;
- vector<int> fac(N,1),ifac(N,1);
- for(int i=2;i<N;++i){
- fac[i] = (fac[i-1]*1ll*i)%p;
- ifac[i] = p-(((p/i)*1ll*ifac[p%i])%p);
- }
- for(int i=2;i<N;++i){
- ifac[i] = (ifac[i]*1ll*ifac[i-1])%p;
- }
- unordered_map<long long,int> ans;
- function<int(int,long long)> solve = [&](int i,long long hsh){
- if(!hsh)return 1;
- auto it = ans.find(hsh);
- if(it!=ans.end())return it->second;
- int cur = 0;
- for(int j=n-1;j>=0;--j){
- if(t[j]<s[i])break;
- if(!((hsh>>j)&1))continue;
- cur = (cur+(ifac[t[j]-s[i]]*1ll*solve(i-1,hsh^(1ll<<j))))%p;
- }
- return ans[hsh]=cur;
- };
- int T = 0;
- for(int i=0;i<n;++i)T+=(t[i]-s[i]);
- int fans = 1;
- for(int i=1;i<=T;++i)fans = (fans*1ll*i)%p;
- cout<<((fans*1ll*solve(n-1,(1ll<<n)-1))%p);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement