题目并没有保证r大于n和m,而r小于n,m时由于逆元的一些问题许多做法会炸,比如下面这个:
#include<bits/stdc++.h>
using namespace std;
#define re register
typedef long long ll;
const int maxn=1e7+3;
int n,m,t,r,tot,prime[maxn],fac[maxn],sum[maxn],tfac[maxn];
bool he[maxn];
void get_prime(){
he[1]=1;
for(re int i=2;i<=maxn-3;i++){
if(!he[i]) prime[++tot]=i;
for(re int j=1;j<=tot&&i*prime[j]<=maxn-3;j++){
he[i*prime[j]]=1;
if(i%prime[j]==0) break;
}
}
}
int power(int a,int b){
int res=1;
while(b){
if(b&1) res=1LL*res*a%r;
b>>=1;
a=1LL*a*a%r;
}
return res;
}
int main(){
get_prime();
scanf("%d%d",&t,&r);
fac[0]=tfac[0]=1;
for(re int i=1;i<=maxn-3;i++) fac[i]=1LL*fac[i-1]*i%r;
sum[1]=1;
for(re int i=2;i<=maxn-3;i++) sum[i]=(he[i]?sum[i-1]:1LL*sum[i-1]*(i-1)%r*power(i,r-2)%r);
while(t--){
scanf("%d%d",&n,&m);
int ans=1LL*fac[n]*sum[m]%r;
printf("%d\n",ans);
}
return 0;
}
/*
HACK:
1 7
11 8
*/
然而题目并没有卡???