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

    (1sim n!)中与(m!)互质的数的个数。(mleq nleq 10^7).

    显然(m!|n!)。根据GCD的性质,((a,b)=(a+b,b)),则((a,m!)=(a+m!,m!))。于是每(m!)分一组,易得

    [ans=sum_{i=1}^{n!}[(i,m!)=1]\ =frac{n!}{m!}varphi(m!)=n!prodfrac{p_i-1}{p_i},p_ileq m ]

    然后。就被开心地卡常了。

    逆元要写递推的,而且还要避免多次取模。见代码。

    循环尽量别合并。

    #include<cstdio>
    using namespace std;
    const int N=1e7+5;
    
    int t,r,n,m;
    int vis[N],p[N/10],lp;
    void sieve(int k){
        vis[0]=vis[1]=1;
        for(int i=2;i<=k;i++){
            if(!vis[i])p[++lp]=i;
            for(int j=1;j<=lp;j++){
                if(i*p[j]>k)break;
                vis[i*p[j]]=1;
                if(i%p[j]==0)break;
            }
        }
    }
    int fac[N],inv[N],fp[N];//fac phi
    int main(){
        scanf("%d%d",&t,&r);
    
        sieve(1e7);
        fac[0]=1;
        for(int i=1;i<=10000000;i++)fac[i]=1ll*i*fac[i-1]%r;
        inv[1]=1;
        for(int i=2;i<=10000000;i++)inv[i]=(1ll*(r-r/i)*inv[r%i]%r);
        fp[1]=1;
        for(int i=2;i<=10000000;i++){
            fp[i]=fp[i-1];
            if(vis[i]==0)fp[i]=1ll*fp[i]*(i-1)%r*inv[i]%r;
        }
    
        while(t--){
            scanf("%d%d",&n,&m);
            printf("%lld
    ",1ll*fac[n]*fp[m]%r);
        }
        return 0;
    }
    
  • 相关阅读:
    日历(Calendar)模块
    关于Python3中函数:
    正则表达式全集
    python同时遍历两个list
    Python 类
    vs_code 快捷键
    Linux常用命令大全
    Linux基础命令sort
    Linux基础命令练习题答案7.10
    Linux基础命令练习题7.10
  • 原文地址:https://www.cnblogs.com/sshwy/p/11047129.html
Copyright © 2011-2022 走看看