P2183 [国家集训队]礼物

题意:

有n个礼物,分给m个人,分给第i个人的礼物数量是wi,问送礼物的方案数。

题解:

扩展卢卡斯模板题
很容易看出和组合数有关的题目,对于总方案,完美可以将其分解为m个不同的方案数的乘积
比如样例1:4个礼物,2个人,第一个人要1个礼物,则第一个人取走礼物的方案为C41C_{4}^{1}C41​,第二个人要2个礼物,方案为C32C_{3}^{2}C32​,总方案为C41∗C32=12C_{4}^{1}*C_{3}^{2}=12C41​∗C32​=12
现在改变顺序:第二个人先拿礼物,C42C_{4}^{2}C42​,然后第一个人拿礼物,C21C_{2}^{1}C21​,总方案为C42∗C21=12C_{4}^{2}*C_{2}^{1}=12C42​∗C21​=12
完美可以发现,无论谁取走礼物,结果都是一样的,那我们只需要按照所给礼物顺序计算就行。
总方案为:Cnw1∗Cn−w1w2∗....modpC_{n}^{w_{1}}*C_{n-w_{1}}^{w_{2}}*....\bmod pCnw1​​∗Cn−w1​w2​​∗....modp
本题的p不一定是质数,此时就没办法求组合数,就要用的扩展卢卡斯定理,该算法就是专门解决模数p不是质数的情况

代码:

#include <bits/stdc++.h>
#include <cstdio>
using namespace std;
#define FOR(i, a, b) for (ll i= a; i <= b; ++i)
#define DEC(i, a, b) for (ll i= a; i >= b; --i)typedef long long ll;ll mod;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;return;
}inline ll inv(ll n, ll p)
{ll x, y;exgcd(n, p, x, y);return (x + p) % p;
}ll qpow(ll base, ll p, ll mod)
{ll ret= 1;for (; p; p>>= 1, base= base * base % mod)if (p & 1)ret= ret * base % mod;return ret;
}ll CRT(int n, ll* a, ll* m)
{ll M= 1, ret= 0;FOR(i, 1, n) M*= m[i];FOR(i, 1, n){ll w= M / m[i];ret= (ret + a[i] * w % mod * inv(w, m[i]) % mod) % mod;}return (ret + mod) % mod;
}ll calc(ll n, ll q, ll qk)
{if (!n)return 1;ll ret= 1;FOR(i, 1, qk)if (i % q)ret= ret * i % qk;ret= qpow(ret, n / qk, qk);FOR(i, n / qk * qk + 1, n)if (i % q)ret= ret * (i % qk) % qk;return ret * calc(n / q, q, qk) % qk;
}ll multiLucas(ll n, ll m, ll q, ll qk)
{int cnt= 0;for (ll i= n; i; i/= q)cnt+= i / q;for (ll i= m; i; i/= q)cnt-= i / q;for (ll i= n - m; i; i/= q)cnt-= i / q;return qpow(q, cnt, qk) * calc(n, q, qk) % qk * inv(calc(m, q, qk), qk) % qk * inv(calc(n - m, q, qk), qk) % qk;
}ll exLucas(ll n, ll m, ll p)
{int cnt= 0;ll qk[20], a[20]; //存放所有的 q^k 和待合并答案的结果for (ll i= 2; i * i <= p; ++i) //质因数分解{if (p % i == 0) {qk[++cnt]= 1;while (p % i == 0)qk[cnt]*= i, p/= i;a[cnt]= multiLucas(n, m, i, qk[cnt]);}}if (p > 1)qk[++cnt]= p, a[cnt]= multiLucas(n, m, p, p);return CRT(cnt, a, qk); //CRT 合并答案
}
int w[20];
int main()
{ll n, m, p;scanf("%lld %lld %lld", &p, &n, &m);mod= p;int sum= 0;for (int i= 1; i <= m; i++)cin >> w[i], sum+= w[i];if (sum > n) {printf("Impossible");return 0;}ll ans= 1;for (int i= 1; i <= m; i++) {ans= ans * exLucas(n, w[i], mod) % mod;n-= w[i];}printf("%lld\n", ans);return 0;
}

P2183 [国家集训队]礼物(扩展卢卡斯)相关推荐

  1. P2183 [国家集训队]【一本通提高组合数学】礼物

    [国家集训队]礼物 题目背景 一年一度的圣诞节快要来到了.每年的圣诞节小 E 都会收到许多礼物,当然他也会送出许多礼物.不同的人物在小 E 心目中的重要性不同,在小 E 心中分量越重的人,收到的礼物会 ...

  2. 【数学】扩展卢卡斯定理

    Description 求 ( n m ) m o d p \dbinom{n}{m}\bmod p (mn​)modp 其中 p p p 较小且 不保证 p p p 是质数. Method 前置芝士 ...

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

    卢卡斯定理&扩展卢卡斯 Lucas EXlucas 例题 Lucas 卢卡斯定理: ( m n ) = ( m p n p ) ∗ ( m ( m o d p ) n ( m o d p ) ...

  4. 国家集训队论文分类整理[转]

    国家集训队论文分类整理 转自这里 dalao写的东西,是非常有学习价值的.反正noip不一定会用,但是对以后肯定有用的. 组合数学 计数与统计 2001 - 符文杰:<Pólya原理及其应用&g ...

  5. 国家集训队论文分类整理

    国家集训队论文分类整理 组合数学 计数与统计 2001 - 符文杰:<Pólya原理及其应用> 2003 - 许智磊:<浅谈补集转化思想在统计问题中的应用> 2007 - 周冬 ...

  6. 国家集训队论文分类整理(转)

    国家集训队论文分类整理 ----------转自https://www.cnblogs.com/AbandonZHANG/archive/2012/07/21/2601889.html 距离ACM/I ...

  7. 国家集训队论文集题目

    这些论文还是很不错的,可以当成专题到谷歌上搜着看看,权当拓展下知识. 国家集训队1999论文集 陈宏:<数据结构的选择与算法效率--从IOI98试题PICTURE谈起> 来煜坤:<把 ...

  8. acm国家集训队论文(1999-2009)

    原文地址http://blog.sina.com.cn/s/blog_49eda3f30100r6ip.html 国家集训队1999论文集  陈宏:<数据结构的选择与算法效率--从IOI98试题 ...

  9. 洛谷:P2172 [国家集训队]部落战争

    题目链接: P2172 [国家集训队]部落战争 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 解题思路: 很明显的二分图:将原点与它能走到的点连一条边,然后做一遍最小点覆盖:即选出 ...

最新文章

  1. 画布Canvas的使用
  2. 鸟哥的Linux私房菜(服务器)- 簡易 OpenWebMail 設定
  3. Java jmap查看堆内存
  4. 双代号网络图基础算法_9个简单数学算法在管理领域的运用
  5. windows API函数copyfile
  6. Windows消息机制详解
  7. 总结 创建领取 微信会员卡 踩过的坑
  8. SUSE11 搭建iscsi target 配置
  9. 使用BusyBox制作根文件系统的操作步骤
  10. sd-card on android 5.0,Android5.0以上SDCard文件删除问题
  11. .net在当前日期的基础上加一天
  12. andpods授权码订单号分享_Axure 9.0学生免费授权申请详细步骤
  13. 华硕飞行堡垒7在BIOS中开启AMD-V
  14. 如何在web配置一个高效采集数据的DTM?
  15. 武昌理工学院计算机巧业怎样,最潮高校宿管员巧念育人经 做学生们的“知心大姐”...
  16. 《京东话费充值系统架构演进实践》阅读笔记
  17. gdb调试 程序退出没有堆栈信息([Inferior 1 (process 12867) exited with code 0177])
  18. 微信小程序小功能分享一( canves制图之后台base64图片转为微信临时文件)
  19. Stronger Data Poisoning Attacks Break Data Sanitization Defenses
  20. 基于matlab活体检测,人脸识别中活体检测算法综述.PDF

热门文章

  1. 哪些才是对女朋友的有效关心,来学习一下~
  2. 复工之后,如何让自己的时间更值钱
  3. 【物理笑话】学过物理的人才能看懂的笑话,你能看明白几个?
  4. 收藏 | 分享 3 种脑洞大开的Excel技巧
  5. oracle分区exchange,oracle 分区表exchange原理
  6. docker源码_使用docker、Jenkins、gitlee、springboot、搭建个人博客网站 并实现CI/CD 外加机器人提醒...
  7. java awt区域_java的awt包中有没有表示区域的类或者方法,可以传递一个Rectangle
  8. linux把终端嵌入桌面,在Ubuntu Linux桌面上嵌入终端窗口
  9. 行者运行脚本命令_行者脚本指令说明
  10. w7下如何安装linux双系统,ubuntu安装教程(下): 教你装win7+Ubuntu双系统