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

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}=12C41C32=12
现在改变顺序:第二个人先拿礼物,C42C_{4}^{2}C42,然后第一个人拿礼物,C21C_{2}^{1}C21,总方案为C42∗C21=12C_{4}^{2}*C_{2}^{1}=12C42C21=12
完美可以发现,无论谁取走礼物,结果都是一样的,那我们只需要按照所给礼物顺序计算就行。
总方案为:Cnw1∗Cn−w1w2∗....modpC_{n}^{w_{1}}*C_{n-w_{1}}^{w_{2}}*....\bmod pCnw1Cnw1w2....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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316220.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Eyjafjalla

区间查询有关比大小的数目&#xff0c; 主席树感觉学线段树的时候不用x<<1,x<<1|1去建一次树那样就容易理解多了&#xff1b; #include<cstdio> #include<iostream> #include<cstring> #include<vector> #include<queue> #include…

P4345 [SHOI2015]超能粒子炮·改

P4345 [SHOI2015]超能粒子炮改 题意&#xff1a; 求解式子∑i0kCni%p\sum_{i0}^{k}C_{n}^{i} \% p∑i0k​Cni​%p n,k<1e18 题解&#xff1a; 设f(n,k)∑i0kCnif(n,k)\sum_{i0}^{k}C_{n}^{i}f(n,k)∑i0k​Cni​ 开始化简&#xff1a; 由卢卡斯定理得&#xff1a; f(n,k)…

.NET Framework VS .NET Core

本文对应的原文来至 c-sharpcorner 的一篇文章&#xff0c;文末有链接。如有错误&#xff0c;还请指正。前言你会为你的下一个应用程序选择哪一种开发平台 - .NET Framework 或者 .NET Core&#xff1f;在这篇文章中&#xff0c;让我们比较一下这两个开发平台的特点&#xff0c…

P6669 [清华集训2016] 组合数问题

P6669 [清华集训2016] 组合数问题 题意&#xff1a; 给你n&#xff0c;m&#xff0c;k&#xff0c;问有多少对(i,j)满足K∣CijK|C_{i}^{j}K∣Cij​ (Cij是k的倍数C_{i}^{j}是k的倍数Cij​是k的倍数) n,m<1e18 题解&#xff1a; n和m非常大&#xff0c;非常非常大&#x…

解决 VS2019 中.net core WPF 暂时无法使用 Designer 的临时方法

以下方法来自于微软github开源项目WPF:dotnet/samples - WPF Hello World sample with linked files&#xff0c;请放心使用。此篇文章是上篇文章解决vs2019中暂时无法为.net core WinForms使用 Designer 的临时方法的姊妹篇&#xff0c;但对WPF而言实现起来比WinForms简单很多…

Building Fire Stations

题目链接 首先找到树的直径&#xff0c;直径左端点是a&#xff0c;直径右端点是b&#xff0c;中间的点是mid&#xff08;偶数的情况下mid可以看做两个&#xff09;&#xff0c;两点因该是左右分布&#xff1b; 假设两点都不在直径上&#xff0c;那么移到直径上的话距离更短&a…

.NET Core 迁移躺坑记

最近将自己负责的一个核心接口系统从.Net Framework迁移到了.Net Core。整体过程&#xff0c;从业务层面说一般般吧(整体还好但还是搞的业务有感&#xff0c;没出严重故障&#xff09;但是技术层面上感觉其实并没有达到要求&#xff0c;不过预期也是应该不会那么顺利&#xff0…

P4720 【模板】扩展卢卡斯定理/exLucas(无讲解,纯记录模板)

P4720 【模板】扩展卢卡斯定理/exLucas 题意&#xff1a; CnmmodpC_{n}^{m}\bmod pCnm​modp 对于 100% 的数据&#xff0c;1≤m≤n≤1018&#xff0c;2≤p≤106&#xff0c;不保证 p 是质数。 题解&#xff1a; 模板题&#xff0c;单纯写本文章记录板子 代码&#xff1a; …

[Abp vNext 源码分析] - 2. 模块系统的变化

一、简要说明本篇文章主要分析 Abp vNext 当中的模块系统&#xff0c;从类型构造层面上来看&#xff0c;Abp vNext 当中不再只是单纯的通过 AbpModuleManager 来管理其他的模块&#xff0c;它现在则是 IModuleManager 和 IModuleLoader 来协同工作&#xff0c;其他的代码逻辑并…

P3301 [SDOI2013]方程

P3301 [SDOI2013]方程 题意&#xff1a; 题解&#xff1a; 插板法介绍 首先要先讲组合数学的一个方法&#xff1a;插板法 问题引出&#xff1a;把10个球放进三个盒子&#xff0c;每个箱子至少一个有多少种分法&#xff1f; 10个球就有9个空隙&#xff0c;我们可以考虑在这个…

201912-3 化学方程式

他这个好像之和大写字母有关系&#xff1b; 小写字母跟着前面的的大写字母&#xff1b; 和代表要处理了&#xff1b; &#xff08;&#xff09;代表要乘了&#xff1b; #include<iostream> #include<cstdio> #include<algorithm> #include<cstring>…

.NET Framework 4.8发布

原文地址&#xff1a;https://devblogs.microsoft.com/dotnet/announcing-the-net-framework-4-8/我们很高兴地宣布今天发布.NET Framework 4.8。它包含在Windows 10 May 2019更新中。.NET Framework 4.8也可在Windows 7和Windows Server 2008 R2 上使用。您可以从我们的 .NET下…

Deltix Round, Summer 2021 (open for everyone, rated, Div. 1 + Div. 2)

Deltix Round, Summer 2021 (open for everyone, rated, Div. 1 Div. 2) 题号题目知识点AA Variety of OperationsBTake Your Places!CCompressed Bracket SequenceDTake a GuessEEquilibriumFSports BettingGGates to Another WorldHDIY Tree

[NewLife.XCode]数据层缓存(网站性能翻10倍)

NewLife.XCode是一个有10多年历史的开源数据中间件&#xff0c;支持nfx/netcore&#xff0c;由新生命团队(2002~2019)开发完成并维护至今&#xff0c;以下简称XCode。整个系列教程会大量结合示例代码和运行日志来进行深入分析&#xff0c;蕴含多年开发经验于其中&#xff0c;代…

cf1556A. A Variety of Operations

cf1556A. A Variety of Operations 题意&#xff1a; 有两个数a&#xff0c;b一开始都是0&#xff0c;现在有三种操作&#xff1a; 给a和b都加ka加k&#xff0c;b减ka减k&#xff0c;b加k 问从a0&#xff0c;b0到ac&#xff0c;bd最少需要几步&#xff1f; 题解&#xff1a…

[NewLife.XCode]高级查询(化繁为简、分页提升性能)

NewLife.XCode是一个有10多年历史的开源数据中间件&#xff0c;支持nfx/netcore&#xff0c;由新生命团队(2002~2019)开发完成并维护至今&#xff0c;以下简称XCode。整个系列教程会大量结合示例代码和运行日志来进行深入分析&#xff0c;蕴含多年开发经验于其中&#xff0c;代…

cf1556B B. Take Your Places!

cf1556B B. Take Your Places! 题意&#xff1a; 有n个数&#xff0c;你可以将相邻两个数交换&#xff0c;使得奇偶性一样的数不相邻。问最少操作步数 题解&#xff1a; 最终排列无非是&#xff1a;奇&#xff0c;偶&#xff0c;奇…或者偶&#xff0c;奇&#xff0c;偶… …

微软云Azure训练营 | 八城联动,全球盛会

Global Azure Bootcamp是由微软发起、MVP参与组织的全球化学习交流活动。每年会挑选一个特定的时间&#xff0c;在同一天内&#xff0c;全球不同地区将同时开展。2019年全球Azure训练营&#xff08;Global Azure Bootcamp&#xff09;将于2019年4月27日在全球270多个城市同时举…

2021-09-211547G - How Many Paths?

#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <set> using namespace std; typedef long long ll;const int N4e510,M1e610,mod998244353;int h[N],hs[N],e[M],ne[M],idx0; // h 原图 hs新图 v…

cf1556Compressed Bracket Sequence

cf1556Compressed Bracket Sequencex 题意&#xff1a; 给你n个数&#xff0c;奇数位置上的数表示左括号的数量&#xff0c;偶数位置上的数表示右括号的数量。问有多少个[l,r]是满足括号匹配的 题解&#xff1a; 括号匹配也算是经典问题了 直接统计不好计算&#xff0c;我们…