加了各种优化,BZOJ还是没过,洛谷倒是过了
主要预处理不是O(n),所以挂了。
乘法逆元+素数
#pragma GCC diagnostic error "-std=c++11"
#pragma GCC optimize("-fdelete-null-pointer-checks,inline-functions-called-once,-funsafe-loop-optimizations,-fexpensive-optimizations,-foptimize-sibling-calls,-ftree-switch-conversion,-finline-small-functions,inline-small-functions,-frerun-cse-after-loop,-fhoist-adjacent-loads,-findirect-inlining,-freorder-functions,no-stack-protector,-fpartial-inlining,-fsched-interblock,-fcse-follow-jumps,-fcse-skip-blocks,-falign-functions,-fstrict-overflow,-fstrict-aliasing,-fschedule-insns2,-ftree-tail-merge,inline-functions,-fschedule-insns,-freorder-blocks,-fwhole-program,-funroll-loops,-fthread-jumps,-fcrossjumping,-fcaller-saves,-fdevirtualize,-falign-labels,-falign-loops,-falign-jumps,unroll-loops,-fsched-spec,-ffast-math,Ofast,inline,-fgcse,-fgcse-lm,-fipa-sra,-ftree-pre,-ftree-vrp,-fpeephole2",3)
#pragma GCC target("avx","sse2")
#include <bits/stdc++.h>
using namespace std ;
#define rep(i,a,b) for (int (i)=(a);(i)<=(b);(i)++)
#define REP(i,a,b) for (int (i)=(a);(i)>=(b);(i)--)
#define Rep(i,x) for (int (i)=head[x];(i);i=next[i])
#define lowbit(x) ((x)&(-(x)))
#define sqr(x) ((x)*(x))
#define clr(a) memset((a),0,sizeof((a)))
#define ls ((x)<<1)
#define rs ((x)<<1|1)
#define mid (((l)+(r))>>1)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
typedef long long ll ;
const int N = 1e7 ;
ll T,p,n,m ;
ll fac[N+10],ans[N+10] ;
bool f[N+10] ;
inline void exgcd(int a,int b,int &x,int &y){
if(b==0){
x=1;y=0;
return ;
}
exgcd(b,a%b,y,x);
y-=x*(a/b) ;
}
inline int getinv(int a){
int x=0,y=0;
exgcd(a,p,x,y);
return (x%p+p)%p;
}
int main(){
scanf("%d%d",&T,&p) ;
fac[1]=1 ;
for (int i=2;i<=N;i++) fac[i]=fac[i-1]*i%p;
ans[1]=1 ;
for (int i=2;i<=N;i++) {
if (!f[i]){
ans[i]=ans[i-1]*(i-1)%p*getinv(i)%p ;
for(int j=2;j<=N/i;j++) f[i*j]=1;
}
else ans[i]=ans[i-1] ;
}
while(T--){
scanf("%d%d",&n,&m) ;
printf("%lld\n",ans[m]*fac[n]%p) ;
}
}