题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2142

前几天学了扩展卢卡斯定理,今天来磕模板!

这道题式子挺好推的(连我都自己推出来了) ,总之就是在 n 个里取 w[1] 个,剩下的里面再取 w[2] 个,再在剩下的里面取...

这里的模数 P 一看就不是质数啊!大组合数对合数取模,就要用到扩展卢卡斯定理了;

关于扩展卢卡斯定理,可以看这篇博客:https://blog.csdn.net/clove_unique/article/details/54571216

然后模仿这篇博客写的(感觉挺清晰的):https://www.cnblogs.com/elpsycongroo/p/7620197.html

扩展卢卡斯定理也没有想象中的那么难写嘛!

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
int const maxn=1e5+;
ll mod,n,m,w[],sum,p[maxn],pk[maxn],cnt,r[maxn],x,y;
void divide(ll n)
{
for(ll i=;i*i<=n;i++)
if(n%i==)
{
p[++cnt]=i; pk[cnt]=;
while(n%i==)pk[cnt]*=i,n/=i;
}
if(n>)p[++cnt]=n,pk[cnt]=n;
}
ll pw(ll a,ll b,ll pk)
{
ll ret=;
for(;b;b>>=1ll,a=(a*a)%pk)
if(b&)ret=(ret*a)%pk;
return ret;
}
void exgcd(ll a,ll b,ll &x,ll &y)
{
if(!b){x=; y=; return;}
exgcd(b,a%b,x,y);
ll t=x; x=y; y=(t-a/b*y)%mod;
}
ll inv(ll n,ll pk)
{
exgcd(n,pk,x,y); return (x%pk+pk)%pk;
}
ll fac(ll n,ll p,ll pk)// n! mod pk=p^k 且去掉 p
{
if(!n)return ;
ll ret=;
for(int i=;i<=pk;i++) if(i%p) ret=(ret*i)%pk;//一个循环节
ret=pw(ret,n/pk,pk);
for(int i=;i<=n%pk;i++) if(i%p) ret=(ret*i)%pk;
return (ret*fac(n/p,p,pk))%pk;//递归求剩余部分
}
ll exlucas(ll n,ll m,ll p,ll pk)// C(n,m) mod pk=p^k
{
if(n<m)return ;
ll a=fac(n,p,pk),b=fac(m,p,pk),c=fac(n-m,p,pk);
ll k=;//p的指数
for(ll i=n;i;i/=p)k+=i/p;
for(ll i=m;i;i/=p)k-=i/p;
for(ll i=n-m;i;i/=p)k-=i/p;
return (((a*inv(b,pk))%pk*inv(c,pk))%pk*pw(p,k,pk))%pk;//a*p^k/(b*c)
}
ll CRT()//合并模数
{
ll M=,ret=;
for(int i=;i<=cnt;i++)M*=pk[i];//pk而不是p !!!
for(int i=;i<=cnt;i++)
{
ll w=M/pk[i];
ret=(ret+w*inv(w,pk[i])*r[i])%M;
}
return (ret%M+M)%M;//
}
ll exc(ll n,ll m)// C(n,m)
{
if(n<m)return ;
for(int i=;i<=cnt;i++)
r[i]=exlucas(n,m,p[i],pk[i]);
return CRT();
}
int main()
{
scanf("%lld%lld%lld",&mod,&n,&m);
for(int i=;i<=m;i++)scanf("%lld",&w[i]),sum+=w[i];
if(sum>n){printf("Impossible\n"); return ;}
divide(mod);
ll ans=;
for(int i=;i<=m;i++)
{
ans=(ans*exc(n,w[i]))%mod;
n-=w[i];
}
printf("%lld\n",ans);
return ;
}

bzoj2142 礼物——扩展卢卡斯定理的更多相关文章

  1. BZOJ2142礼物——扩展卢卡斯

    题目描述 一年一度的圣诞节快要来到了.每年的圣诞节小E都会收到许多礼物,当然他也会送出许多礼物.不同的人物在小E 心目中的重要性不同,在小E心中分量越重的人,收到的礼物会越多.小E从商店中购买了n件礼 ...

  2. [bzoj2142]礼物(扩展lucas定理+中国剩余定理)

    题意:n件礼物,送给m个人,每人的礼物数确定,求方案数. 解题关键:由于模数不是质数,所以由唯一分解定理, $\bmod  = p_1^{{k_1}}p_2^{{k_2}}......p_s^{{k_ ...

  3. 卢卡斯定理&扩展卢卡斯定理

    卢卡斯定理 求\(C_m^n~mod~p\) 设\(m={a_0}^{p_0}+{a_1}^{p_1}+\cdots+{a_k}^{p_k},n={b_0}^{p_0}+{b_1}^{p_1}+\cd ...

  4. 【知识总结】扩展卢卡斯定理(exLucas)

    扩展卢卡斯定理用于求如下式子(其中\(p\)不一定是质数): \[C_n^m\ mod\ p\] 我们将这个问题由总体到局部地分为三个层次解决. 层次一:原问题 首先对\(p\)进行质因数分解: \[ ...

  5. LG4720 【模板】扩展卢卡斯定理

    扩展卢卡斯定理 求 \(C_n^m \bmod{p}\),其中 \(C\) 为组合数. \(1≤m≤n≤10^{18},2≤p≤1000000\) ,不保证 \(p\) 是质数. Fading的题解 ...

  6. 【学习笔记】扩展卢卡斯定理 exLucas

    引子 求 \[C_n^m\ \text{mod}\ p \] 不保证 \(p\) 是质数. 正文 对于传统的 Lucas 定理,必须要求 \(p\) 是质数才行.若 \(p\) 不一定是质数,则需要扩 ...

  7. BZOJ - 2142 礼物 (扩展Lucas定理)

    扩展Lucas定理模板题(貌似这玩意也只能出模板题了吧~~本菜鸡见识鄙薄,有待指正) 原理: https://blog.csdn.net/hqddm1253679098/article/details ...

  8. 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 ...

  9. [BZOJ2142]礼物(扩展Lucas)

    2142: 礼物 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 2286  Solved: 1009[Submit][Status][Discuss] ...

随机推荐

  1. 02Servlet

    Servlet Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地 ...

  2. 基于APE物理引擎的管线容积率计算方法

    容积率一般应用在房地产开发中,是指用地范围内地上总建筑面积与项目总用地面积的比值,这个参数是衡量建设用地使用强度的一项非常重要的指标.在其他行业,容积率的计算也非常重要,如产品利用率.管道使用率等等. ...

  3. 在TWaver的Tree节点上画线

    论坛上有同学提出如何在tree上画引导线,之前我们Flex已经实现此功能,现在最新版的HTML5也将添加此功能.先看看效果:详细的使用方法可以参考我们开发手册中可视化视图组件#Tree引导线一章,下面 ...

  4. C++中重载,重写,隐藏的区别

    重载: 重载是指在同一个作用域下,函数的函数名相同,但是函数参数的个数,或者参数的类型,参数的顺序不同.这时函数之间就构成了重载关系,这里需要注意的是,如果函数的参数列表完全相同,仅仅是返回值类型不同 ...

  5. 2018NOIP普及T4---对称二叉树

    题目 对称二叉树   题目描述 思路 检查是否符合对称条件 条件很简单——结构对称&&点权对称 要做到点权对称其实也就顺便结构对称了 于是条件可以简化为点权对称 可以考虑并行搜索 bo ...

  6. Java中对象流使用的一个注意事项

    再写jsp的实验作业的时候,需要用到java中对象流,但是碰到了之前没有遇到过的情况,改bug改到崩溃!!记录下来供大家分享 如果要用对象流去读取一个文件,一定要先判断这个文件的内容是否为空,如果为空 ...

  7. UVA 674 Coin Change (完全背包)

    解法 dp表示目前的种数,要全部装满所以f[0]=1其余为0的初始化是必不可少的 代码 #include <bits/stdc++.h> using namespace std; int ...

  8. 统计nginx日志里每五分钟的访问量

    #!/usr/bin/env python # -*- coding:utf-8 -*- # Author:Random_lee import time import os import re cla ...

  9. [bzoj1925][Sdoi2010][地精部落] (序列动态规划)

    Description 传说很久以前,大地上居住着一种神秘的生物:地精. 地精喜欢住在连绵不绝的山脉中.具体地说,一座长度为 N 的山脉 H可分 为从左到右的 N 段,每段有一个独一无二的高度 Hi, ...

  10. ganglia371 on suse11sp3

    参考https://my.oschina.net/duangr/blog/181585 1.确认依赖包是否已安装 确认命令:rpm -qa  如下为适合suse11sp3的依赖包版本 apr: lib ...