沙拉公主的困惑 (乘法逆元+素数判定)

加了各种优化,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) ;
    }
}

猜你喜欢

转载自blog.csdn.net/HQG_AC/article/details/81226828