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 }
  • 相关阅读:
    学习Python用来爬虫
    C# 校验帮助类-正则表达式
    关于网站使用异步请求以后浏览器源码查看不到数据导致百度抓取不到的问题解决方案
    Linq学习教程
    【jQuery】选择器
    【jQuery】初始化的三种方法
    【ueditor】api方法
    同步(Synchronous)和异步(Asynchronous)
    【postman】postman
    【mysql函数】FIND_IN_SET函数用法
  • 原文地址:https://www.cnblogs.com/PinkRabbit/p/8166797.html
Copyright © 2011-2022 走看看