挺没意思的题
全都读进去算一个每个阶乘的系数
然后算一遍每个数的系数
最后在质数处算一下答案
#include<bits/stdc++.h> using namespace std; #define rep(i,a,b) for(int i=(a),i##_end=(b);i<=i##_end;++i) #define For(i,a,b) for(int i=(a),i##_end=(b);i<i##_end;++i) #define per(i,a,b) for(int i=(b),i##_st=(a);i>=i##_st;--i) #define fi first #define se second #define pb push_back #define mp make_pair #define dbg(x) cerr<<#x" = "<<x<<endl #define debug(...) fprintf(stderr, __VA_ARGS__) #define Es(x,i) for(Edge*i=G[x];i;i=i->nxt) typedef long long ll; typedef pair<int,int> pii; const int inf=~0u>>1,MOD=1e9+7; char *TT,*mo,but[(1<<15)+2]; #define getchar() ((TT==mo&&(mo=((TT=but)+fread(but,1,1<<15,stdin)),TT==mo))?-1:*TT++) inline int rd() { int x,c,f=1;while(!isdigit(c=getchar()))f=c!=‘-‘;x=c-‘0‘; while(isdigit(c=getchar()))x=x*10+c-‘0‘;return f?x:-x; } const int N=1e6+1; int n,P,mod; int mn[N],p[N],tot; inline void Init(){ For(i,2,N){ if(!mn[i])mn[i]=i,p[++tot]=i; for(int j=1,k;j<=tot&&p[j]<=mn[i]&&(k=i*p[j])<N;++j)mn[k]=p[j]; } int y=mod=P; for(int i=1;p[i]*p[i]<=y;++i){ if(y%p[i]==0){ mod/=p[i],mod*=p[i]-1; do y/=p[i];while(y%p[i]==0); } } if(y^1)mod/=y,mod*=y-1; } int c[N],a[N],b[N]; inline void mad(int&x,int y){ x=(x+y>=mod?x+y-mod:x+y); } inline int pw(int n,int m){ int r=1;for(;m;m>>=1,n=(ll)n*n%P)if(m&1)r=(ll)r*n%P; return r; } int main(){ #ifdef flukehn freopen("test.txt","r",stdin); #endif n=rd(),P=rd(); Init(); rep(i,1,n)a[i]=rd(); rep(i,1,n)b[i]=rd(); rep(i,1,n)++c[b[i]],--c[a[i]],--c[b[i]-a[i]]; per(i,2,N-2)c[i]+=c[i+1]; For(i,2,N)c[i]=(c[i]%mod+mod)%mod; ll ans=1; per(i,2,N-1)if(c[i]){ if(mn[i]==i)ans=ans*pw(i,c[i])%P; else mad(c[mn[i]],c[i]),mad(c[i/mn[i]],c[i]); } cout<<ans<<endl; }