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\n"); return 0;}
    R ans=1; for(R i=1;i<=m;++i) ans=ans*solve(n,w[i])%p,n-=w[i];
    printf("%lld\n",ans);
}

2019.05.18

转载于:https://www.cnblogs.com/Jackpei/p/10885350.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值