整理的算法模板合集: ACM模板

点我看算法全家桶系列!!!

实际上是一个全新的精炼模板整合计划


题目链接

https://hydro.ac/d/bzoj/p/2142

是 hydro 的 BZOJ 修复工程 !(我也去领了一点题慢慢修着玩,这题就是我修的嘿嘿嘿)

题目描述

一年一度的圣诞节快要来到了。每年的圣诞节小E都会收到许多礼物,当然他也会送出许多礼物。不同的人物在小E心目中的重要性不同,在小E心中分量越重的人,收到的礼物会越多。小E从商店中购买了 nnn 件礼物,打算送给 mmm 个人,其中送给第 iii 个人礼物数量为 wiw_iwi​ 。请你帮忙计算出送礼物的方案数(两个方案被认为是不同的,当且仅当存在某个人在这两种方案中收到的礼物不同)。由于方案数可能会很大,你只需要输出模 PPP 后的结果。

输入格式

输入的第一行包含一个正整数 PPP ,表示模数;

第二行包含两个整整数 nnn 和 mmm ,分别表示小E从商店购买的礼物数和接受礼物的人数;

以下 mmm 行每行仅包含一个正整数 wiw_iwi​ ,表示小E要送给第 iii 个人的礼物数量。

输出格式

若不存在可行方案,则输出 “Impossible” ,否则输出一个整数,表示模 PPP 后的方案数。

输入样例

100
4 2
1
2

输出样例

12

数据规模和约定

设 P=p1c1×p2c2×p3c3×⋯×ptctP=p_1^{c_1} \times p_2^{c_2} \times p_3^{c_3} \times \cdots \times p_t ^ {c_t}P=p1c1​​×p2c2​​×p3c3​​×⋯×ptct​​,pip_ipi​ 为质数。
对于 100%100\%100% 的数据,1≤n≤1091\le n\le 10^91≤n≤109,1≤m≤51\le m\le 51≤m≤5,1≤pici≤1051\le p_i^{c_i}\le 10^51≤pici​​≤105。

提示

【样例说明】

下面是对样例111 的说明。
/ 分割,/ 前后分别表示送给第一个人和第二个人的礼物编号。121212 种方案详情如下:

1/23 1/24 1/34
2/13 2/14 2/34
3/12 3/14 3/24
4/12 4/13 4/23

Solution

一共 nnn 个礼物,第 111 个人需要 w1w_1w1​ 个礼物,方案数为 (w1n)\displaystyle {w_1 \choose n}(nw1​​),然后对于第二个人,从剩下的 n−w1n-w_1n−w1​ 个礼物中选出 w2w_2w2​ 个礼物送给第二个人,方案数为 (w2n−w1)\displaystyle {w_2\choose {n-w_1}}(n−w1​w2​​),一次类推,总方案数根据乘法原理显然为:

∏i=1n(win−∑j=1iwj)modp\prod_{i = 1}^{n} {w_i\choose \displaystyle n-\sum_{j=1}^{i}w_j}\mod p i=1∏n​(n−j=1∑i​wj​wi​​)modp

考虑如何计算。

由于给定的模数 ppp 不是质数,所以我们需要用拓展Lucas定理计算,然后就是一个拓展lucas的模板题了…

关于拓展Lucas定理:



Code

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int maxn = 1e4 + 6;
int n, m, s, t, ans;
int primes[maxn], cnt;
bool vis[maxn];
int v[maxn], M;
ll A, B;
int mod;
int w[maxn];
int r[maxn];struct mods
{int c, p;ll pc;
}f[maxn];ll qpow(ll a, ll b, ll mod)
{ll res = 1;while(b) {if(b & 1) res = res * a % mod;a = a * a % mod;b >>= 1;}return res;
}ll exgcd(ll a, ll b, ll &x, ll &y)
{if(b == 0) {x = 1, y = 0;return a;}ll d = exgcd(b, a % b, x, y);ll z = x;x = y;y = z - y * (a / b);return d;
}inline ll inv(ll a, ll p)
{ll x, y;exgcd(a, p, x, y);return (x + p) % p;
}//计算 x! 中除掉 val = prime 后模 p 的值
inline ll cal(ll x, ll val, ll p)
{if(x == 0) return 1;ll res = 1;ll last = x % p;for (int i = 1; i <= p; ++ i) if(i % val)    res = res * i % p;res = qpow(res, x / p, p);for (ll i = 1; i <= last; ++ i)if(i % val) res = res * i % p;return res * cal(x / val, val, p) % p;
}inline ll C(ll n, ll m, ll p, ll pc)
{if(m > n) return 0;ll k = 0;ll up = cal(n, p, pc);ll down1 = cal(m, p, pc);ll down2 = cal(n - m, p, pc);for (int i = n; i; i /= p) k += i / p;for (int i = m; i; i /= p) k -= i / p;for (int i = n - m; i; i /= p) k -= i / p; return up * inv(down1, pc) % pc * inv(down2, pc) % pc * qpow(p, k, pc) % pc;
}inline ll CRT(int cnt)
{ll m = mod, M[maxn] = {}, t[maxn] = {}, res = 0;for (int i = 1; i <= cnt; ++ i)M[i] = m / f[i].pc; for (int i = 1; i <= cnt; ++ i) {ll y; exgcd(M[i], f[i].pc, t[i], y); res = (res + r[i] % m * M[i] % m * t[i] % m) % m; }return (res % m + m) % m;
}inline ll exlucas(ll A, ll B)
{memset(f, 0, sizeof f);memset(r, 0, sizeof r);int x = mod, cnt = 0;for (ll i = 2; i * i <= x; ++ i) {if(x % i == 0) {f[ ++ cnt].p = i;f[cnt].pc = 1;while(x % i == 0) {x /= i;f[cnt].c ++ ;f[cnt].pc *= i;} r[cnt] = C(A, B, f[cnt].p, f[cnt].pc);}}if(x > 1) {f[ ++ cnt].p = x;f[cnt].c = 1;f[cnt].pc = x; r[cnt] = C(A, B, f[cnt].p, f[cnt].pc);} return CRT(cnt);
}int main()
{scanf("%d%d%d", &mod, &n, &m);ll sum = 0;for (int i = 1; i <= m; ++ i) {scanf("%d", &w[i]);sum += w[i];}if(sum > n) return 0 * puts("Impossible");ll ans = 1;A = n;for (int i = 1; i <= m; ++ i) {B = w[i];ans = (ans * exlucas(A, B)) % mod;A -= w[i];}printf("%lld\n", ans % mod);return 0;
}

BZOJ 2142 礼物(拓展Lucas,中国剩余定理)【BZOJ修复工程】相关推荐

  1. [BZOJ]2142 礼物 扩展Lucas

    2142: 礼物 Time Limit: 10 Sec   Memory Limit: 259 MB Submit: 1788   Solved: 748 [ Submit][ Status][ Di ...

  2. FJNU2018低程A 逃跑路线(Lucas + 中国剩余定理 + LGV定理)题解

    题目描述 n个人在w*h的监狱里面想要逃跑,已知他们的同伙在坐标(bi,h)接应他们,他们现在被关在(ai,1)现在他们必须要到同伙那里才有逃出去的机会,这n个人又很蠢只会从(x,y)->(x+ ...

  3. BZOJ-1951 古代猪文 (组合数取模Lucas+中国剩余定理+拓展欧几里得+快速幂)...

    数论神题了吧算是 1951: [Sdoi2010]古代猪文 Time Limit: 1 Sec Memory Limit: 64 MB Submit: 1573 Solved: 650 [Submit ...

  4. bzoj 2142 礼物

    题目大意: $n$件礼物,送给$m$个人,其中送给第$i$个人礼物数量为$w_i$,求送礼物的方案数 思路: 显然答案为$\binom{n}{w_1} \binom{n-w_1}{w_2} \cdot ...

  5. 礼物(中国剩余定理+拓展gcd求逆元+分治=拓展Lucus)

    礼物 题意: 求\[C(n,m)\ \%\ p\] \(n,m,p\le 10^9\),且若\(p=\prod_{i=1}^{k}{p_i}^{c_i}\),则\(\forall i\in [1..k ...

  6. BZOJ1951 [Sdoi2010]古代猪文 【费马小定理 + Lucas定理 + 中国剩余定理 + 逆元递推 + 扩展欧几里得】...

    题目 "在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色的大草坪,他们善良勇敢相互都关心--" --选自猪王国民歌 很久很久以前,在山的那 ...

  7. bzoj 3055礼物运送 floyed + 状压DP

    bzoj 3055: 礼物运送 floyed first 设f[i][S]表示取到了S集合中的所有点(不一定是经过的所有点),最后停在了i的最优值. 初始就f[i][{i}] = dis[1][i] ...

  8. 中国剩余定理及其拓展

    中国剩余定理 实质就是解nnn次互质的方程,然后分别乘以他们的取模剩余量,然后相加得到答案,这里就不展开叙述. typedef long long ll; const int N = 1e3 + 10 ...

  9. 学习拓展中国剩余定理小结

    前言 话说中国剩余定理好早就会了,但是一直木有接触过拓展的. 只知道它是个什么东东. 最近似乎需要它了,稍微学了学,似乎还挺简单的. 小结一下~ 简介 中国剩余定理我们都懂吧? 而拓展则是把它后面的模 ...

最新文章

  1. 值得mark的11个开源机器学习项目 .
  2. .NET(C#):警惕PLINQ结果的无序性
  3. Go:go语言的认识理解、安装应用、语法使用之详细攻略
  4. P4879-ycz的妹子【分块】
  5. java基础面试题:说说和的区别
  6. 一个从文本文件里“查找并替换”的功能
  7. zabbix通过自动发现功能实现自动识别网络设备接口
  8. 2018想要薪资翻倍?你需要掌握这个技能
  9. 计算机量子化学计算焓变,中国科学技术大学超级计算中心
  10. MSF Exploit入侵电脑实践(Win7/Win10皆可)
  11. 稳居商用车ADAS前装第一梯队,这家中国本土供应商靠什么?
  12. 六大CPU体系结构:X86、 ARM、MIPS、PowerPC、Sparc、Alfa发展
  13. 重装系统后,硬盘分区丢失的解决办法
  14. 定义int数组求所有奇数的和
  15. 网络安全中常见的攻击方式
  16. 一种下载网页中视频的方式
  17. 主板风扇转不开机是什么问题_电脑主板通电,风扇也转,怎么开不了机,显示屏也没反应...
  18. 数据仓库(三)之架构篇
  19. 如何在Mac终端删除U盘的隐藏文件
  20. linux自制硬件防火墙,自制linux系统——打造属于自己的linux系统

热门文章

  1. 收藏 | PyTorch模型训练特征图可视化(TensorboardX)
  2. 基于OpenCV提取特定区域方法汇总
  3. Batch Normalization的诅咒
  4. 字节流数据的写出(输出)和读取(输入)
  5. 《Greenplum企业应用实战》一导读
  6. zookeeper3.4.6配置实现自动清理日志
  7. 第九天:基础文件管理
  8. 浅谈分布式计算的开发与实现(一)
  9. 利用nginx+tomcat+memcached组建web服务器负载均衡
  10. cloudera之hadoop-0.20.1+152.tar.gz 安装出现找不到JAVA_HOME问题的解决办法