zoukankan      html  css  js  c++  java
  • 【bzoj题解】2186 莎拉公主的困惑

    题目传送门

    题意:求([1,n!])中与(m!)互质的数的个数,对质数(R)取模,(ngeq m)。

    答案应该等于(frac{n!}{m!}phi(m!)=frac{n!}{m!}m!prod_{p|m!}frac{p-1}{p}=n!frac{prod_{pleq m}\,p-1}{prod_{pleq m}\,p})。

    这里(p)为小于等于(m)的质数。

    所以我们处理出阶乘,以及质数的乘积和对(R)的逆元就能得出答案。

    你真的这么想?

    naive!simple!

    如果(ngeq R),答案一定为(0)吗?

    可以看看这组数据:

    1 3
    4 3

    答案为(2),因为(8\,mod\,3=2)。

    但是(4!frac{1cdot 2}{2cdot 3})呢?(4!=24),而(24\,mod\,3=0),但是答案非(0)。

    正确的做法是什么?

    当(ngeq R)时,如果(mgeq R)的话,(n!)中的因子(R)就有可能被分母消掉,我们应该要对(ngeq R)的(n!)消掉一个(R),对(mgeq R)的分母也消掉一个(R)。

    这样就不会有问题了。

    代码如下:

     1 #include<cstdio>
     2 #define F(i,a,b) for(int i=(a);i<=(b);++i)
     3 #define F2(i,a,b) for(int i=(a);i<(b);++i)
     4 int T,Mod,n,m;
     5 int primes[664580], pnum=0;
     6 bool isn_prime[10000001];
     7 int pi[664580],inv[10000001];
     8 int in[664580],fct[10000001];
     9 int pos[10000001];
    10 void init(){
    11     isn_prime[0]=isn_prime[1]=1;
    12     F(i,2,10000000){
    13         if(!isn_prime[i]) primes[++pnum]=i;
    14         for(int j=1;j<=pnum&&primes[j]*i<=10000000;++j){
    15             isn_prime[primes[j]*i]=1;
    16             if(i%primes[j]==0) break;
    17         }
    18     }
    19     inv[1]=1; for(int i=2;i<Mod&&i<=10000000;++i)
    20         inv[i]=1ll*(Mod-Mod/i)*inv[Mod%i]%Mod;
    21     pi[0]=1; F(i,1,pnum) pi[i]=1ll*pi[i-1]*(primes[i]-1)%Mod;
    22     in[0]=1; F(i,1,pnum) if(primes[i]!=Mod) in[i]=1ll*in[i-1]*inv[primes[i]%Mod]%Mod; else in[i]=in[i-1];
    23     fct[0]=1; F(i,1,10000000) if(i!=Mod) fct[i]=1ll*fct[i-1]*i%Mod; else fct[i]=fct[i-1];
    24     F(i,2,10000000) if(isn_prime[i]) pos[i]=pos[i-1]; else pos[i]=pos[i-1]+1; 
    25 }
    26 int main(){
    27     scanf("%d%d",&T,&Mod);
    28     init();
    29     while(T--){
    30         scanf("%d%d",&n,&m);
    31         if(n>=Mod&&m<Mod) puts("0");
    32         else printf("%d
    ",1ll*fct[n]*pi[pos[m]]%Mod*in[pos[m]]%Mod);
    33     }
    34     return 0;
    35 }
  • 相关阅读:
    Codeforces 1045C Hyperspace Highways (看题解) 圆方树
    Codeforces 316E3 线段树 + 斐波那切数列 (看题解)
    Codeforces 803G Periodic RMQ Problem 线段树
    Codeforces 420D Cup Trick 平衡树
    Codeforces 295E Yaroslav and Points 线段树
    Codeforces 196E Opening Portals MST (看题解)
    Codeforces 653F Paper task SA
    Codeforces 542A Place Your Ad Here
    python基础 异常与返回
    mongodb 删除
  • 原文地址:https://www.cnblogs.com/PinkRabbit/p/8166797.html
Copyright © 2011-2022 走看看