• Luogu P2183 [国家集训队]礼物 扩展卢卡斯+组合数


    好吧学长说是板子。。。学了之后才发现就是板子qwq


    题意:求$ C_n^{w_1}*C_{n-w_1}^{w_2}*C_{n-w_1-w_2}^{w_3}*...space mod space P$

    当然,如果$Sigma w_i >n$,则无解。

    不会扩展卢卡斯?

    #include<cstdio>
    #include<iostream>
    #define ll long long
    #define R register ll
    using namespace std;
    inline ll g() {
        R ret=0,fix=1; register char ch; while(!isdigit(ch=getchar())) fix=ch=='-'?-1:fix;
        do ret=ret*10+(ch^48); while(isdigit(ch=getchar())); return ret*fix;
    }
    inline ll qpow(ll a,ll b,ll p) { R ret=1; a%=p;
        for(;b;b>>=1,(a*=a)%=p) if(b&1) (ret*=a)%=p; return ret;
    }
    inline void exgcd(ll a,ll b,ll& x,ll& y) {
        if(!b) {x=1,y=0; return ;} 
        exgcd(b,a%b,y,x),y-=a/b*x;
    }
    inline ll Inv(ll n,ll p) {
        R x,y; exgcd(n,p,x,y); return (x%p+p)%p;
    }
    ll n,m,p,w[6];
    inline ll fac(int n,int pi,int pk) {
        if(!n) return 1; R ans=1;
        for(R i=2;i<pk;++i) if(i%pi) ans=ans*i%pk;//循环节
        ans=qpow(ans,n/pk,pk); //快速幂,即循环节的个数
        for(R i=2;i<=n%pk;++i) if(i%pi) ans=ans*i%pk;//处理最后的散块
        return ans*fac(n/pi,pi,pk)%pk; //递归求解
    }
    inline ll L(int n,int m,int pi,int pk) {
        R ind=0; for(R i=n;i;i/=pi) ind+=i/pi;
        for(R i=m;i;i/=pi) ind-=i/pi;
        for(R i=n-m;i;i/=pi) ind-=i/pi;
        R N=fac(n,pi,pk),M=fac(m,pi,pk),N_M=fac(n-m,pi,pk);
        return N*Inv(M,pk)%pk*Inv(N_M,pk)%pk*qpow(pi,ind,pk)%pk;
    }
    inline ll solve(int n,int m) { R tmp=p,ans=0;
        for(R i=2;i*i<=tmp;++i) if(tmp%i==0) {
            R pk=1; while(tmp%i==0) pk*=i,tmp/=i;
            ans=(ans+L(n,m,i,pk)*Inv(p/pk,pk)%p*p/pk%p)%p;
        } if(tmp>1) ans=(ans+L(n,m,tmp,tmp)*Inv(p/tmp,tmp)%p*p/tmp%p)%p;
        return ans;
    } 
    signed main() {
        p=g(),n=g(),m=g(); R sum=0;
        for(R i=1;i<=m;++i) sum+=(w[i]=g());
        if(sum>n) {printf("Impossible
    "); return 0;}
        R ans=1; for(R i=1;i<=m;++i) ans=ans*solve(n,w[i])%p,n-=w[i];
        printf("%lld
    ",ans);
    }

    2019.05.18

  • 相关阅读:
    Linux命令学习—— fdisk -l 查看硬盘及分区信息
    UE4 Runtime下动态给Actor添加组件
    如何批量下载网站网页
    ue4 motage
    帧同步相关
    张瀚荣:如何用UE4制作3D动作游戏
    游戏服务器架构演进(完整版)
    Digital Mike头发制作及渲染的深度揭秘
    [UE4]如何替换角色Mesh上的Material材质
    [UE4]用C++如何创建Box Collision
  • 原文地址:https://www.cnblogs.com/Jackpei/p/10885350.html
Copyright © 2020-2023  润新知