zoukankan      html  css  js  c++  java
  • BZOJ 2186 [Sdoi2008]沙拉公主的困惑

    又调了半天。。。后来发现自己求逆元时忘开long long。。。一堆负数qwq。


    简而言之,题意就是求φ(m!)*n!/m!,且在mod R意义下。

    我们可以化简一下式子: φ(m!)*n!/m!=m!*Π(p-1)/p*n!/m!=n!*Π(p-1)/p,其中p为m!的质因子

    求质因子时,因为构成m!=1*2*3*...*m,所以最大质因子不可能比m大;

    所以预处理出1-10000000中的质数和逆元。

    因为是要mod R,所以求n!时取模,并且一旦为0,后面的一定也都为0,可以省一定时间;

    然后求ans时要利用上一个递推过来。

    然后记着有些地方要开long long寄存器。

    #include<cstdio>
    #include<iostream>
    #define R register int
    const int N=1E+7;
    using namespace std;
    inline int g() {
        R ret=0; register char ch; while(!isdigit(ch=getchar())) ;
        do ret=ret*10+(ch^48); while(isdigit(ch=getchar())); return ret;
    }
    int mod,cnt,t,n,m;
    int pri[N>>2],Inv[N+10],jc[N+10],ans[N+10];
    bool v[N+10];
    inline void PRE() { 
        for(R i=2;i<=N;++i) {
            if(!v[i]) pri[++cnt]=i;
            for(R j=1;j<=cnt&&i*pri[j]<=N;++j) {v[i*pri[j]]=true; if(i%pri[j]==0) break;}
        }jc[1]=1; for(R i=2;i<=N&&jc[i-1]!=0;++i) jc[i]=(long long)jc[i-1]*i%mod;//,cout<<jc[i]<<" ";
        Inv[1]=1; for(R i=2;i<=N&&i<mod;++i) Inv[i]=(long long)(mod-mod/i)*Inv[mod%i]%mod;//,cout<<Inv[i]<<endl;
        ans[1]=1; for(R i=2;i<=N;++i) {
            ans[i]=ans[i-1];
            if(!v[i]) ans[i]=(long long)ans[i]*(i-1)%mod*Inv[i%mod]%mod;
        }
    }
    signed main() {
        t=g(),mod=g(); PRE(); while(t--) {
            n=g(),m=g(); printf("%d
    ",(long long)jc[n]*ans[m]%mod);
        } 
    }

    2019.05.14

  • 相关阅读:
    hdu 1269 迷宫城堡 (并查集)
    hdu 1272 小希的迷宫 (深搜)
    hdu 1026 Ignatius and the Princess I (深搜)
    hdu 1099 Lottery
    hdu 1068 Girls and Boys (二分匹配)
    几个基础数位DP(hdu 2089,hdu 3555,uestc 1307 windy 数)
    hdu 1072 Nightmare (广搜)
    hdu 1398 Square Coins (母函数)
    hdu 1253 胜利大逃亡 (深搜)
    hdu 1115 Lifting the Stone (求重心)
  • 原文地址:https://www.cnblogs.com/Jackpei/p/10863407.html
Copyright © 2011-2022 走看看