bzoj 2142 礼物——扩展lucas模板
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2142
没给P的范围,但说 pi ^ ci<=1e5,一看就是扩展lucas。
学习材料:https://blog.csdn.net/clove_unique/article/details/54571216
https://www.cnblogs.com/elpsycongroo/p/7620197.html
于是打(抄)了第一份exlucas的板子。那个把 pi的倍数 和 其余部分 分开处理的写法非常清楚!自己本来还想弄个pair的函数什么的。
num的范围?
#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
const int N=;
int num,m[N],pk[N];
ll mod,w[],a[N],x,y,ans,n,l;
void init(ll n)
{
for(ll i=;i*i<=n;i++)
if(n%i==)
{
m[++num]=i;pk[num]=;
while(n%i==)n/=i,pk[num]*=i;
}
if(n>)m[++num]=n,pk[num]=n;
}
ll pw(ll x,ll k,int mod)
{
ll ret=;x%=mod;while(k){if(k&)(ret*=x)%=mod;(x*=x)%=mod;k>>=;}return ret;
}
ll multi(ll n,int pi,int pk)
{
if(!n)return ;//
ll sum=;
for(int i=;i<pk;i++)if(i%pi)(sum*=i)%=pk;
sum=pw(sum,n/pk,pk);
for(int i=;i<=n%pk;i++)if(i%pi)(sum*=i)%=pk;
return sum*multi(n/pi,pi,pk)%pk;//n/pi!!
}
void exgcd(ll a,ll b,ll &x,ll &y)
{
if(!b){x=;y=;return;}
exgcd(b,a%b,y,x);y-=a/b*x;
}
ll inv(ll n,ll mod){exgcd(n,mod,x,y);return (x+mod)%mod;}
ll exlucas(ll n,ll m,int pi,int pk)
{
if(n<m)return ;//
ll a=multi(n,pi,pk),b=multi(m,pi,pk),c=multi(n-m,pi,pk);
ll k=;
for(ll i=n;i;i/=pi)k+=i/pi;//阶乘的pi的个数
for(ll i=m;i;i/=pi)k-=i/pi;
for(ll i=n-m;i;i/=pi)k-=i/pi;
return a*inv(b,pk)%pk*inv(c,pk)%pk*pw(pi,k,pk)%pk;
}
ll crt()
{
ll M=,ret=;for(int i=;i<=num;i++)M*=pk[i];//pk,not m(pi)
for(int i=;i<=num;i++)
{
ll w=M/pk[i];
(ret+=w*inv(w,pk[i])*a[i])%=mod;
}
return (ret+mod)%mod;
}
ll excomb(ll n,ll k)
{
for(int i=;i<=num;i++)
a[i]=exlucas(n,k,m[i],pk[i]);
return crt();
}
int main()
{
scanf("%lld%lld%lld",&mod,&n,&l);ll tmp=;
init(mod);
for(int i=;i<=l;i++)scanf("%lld",&w[i]),tmp+=w[i];
if(n<tmp){printf("Impossible");return ;}
ans=;
for(int i=;i<=l;i++)
{
tmp=excomb(n,w[i]);
(ans*=tmp)%=mod;n-=w[i];
}
printf("%lld\n",ans);
return ;
}
bzoj 2142 礼物——扩展lucas模板的更多相关文章
- BZOJ - 2142 礼物 (扩展Lucas定理)
扩展Lucas定理模板题(貌似这玩意也只能出模板题了吧~~本菜鸡见识鄙薄,有待指正) 原理: https://blog.csdn.net/hqddm1253679098/article/details ...
- BZOJ.2142.礼物(扩展Lucas)
题目链接 答案就是C(n,m1) * C(n-m1,m2) * C(n-m1-m2,m3)...(mod p) 使用扩展Lucas求解. 一个很简单的优化就是把pi,pi^ki次方存下来,因为每次分解 ...
- BZOJ 2142: 礼物 [Lucas定理]
2142: 礼物 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 1294 Solved: 534[Submit][Status][Discuss] ...
- 【刷题】BZOJ 2142 礼物
Description 一年一度的圣诞节快要来到了.每年的圣诞节小E都会收到许多礼物,当然他也会送出许多礼物.不同的人物在小E 心目中的重要性不同,在小E心中分量越重的人,收到的礼物会越多.小E从商店 ...
- [BZOJ2142]礼物(扩展Lucas)
2142: 礼物 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 2286 Solved: 1009[Submit][Status][Discuss] ...
- BZOJ 2142 礼物 组合数学 CRT 中国剩余定理
2142: 礼物 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 1450 Solved: 593[Submit][Status][Discuss] ...
- [bzoj2142]礼物(扩展lucas定理+中国剩余定理)
题意:n件礼物,送给m个人,每人的礼物数确定,求方案数. 解题关键:由于模数不是质数,所以由唯一分解定理, $\bmod = p_1^{{k_1}}p_2^{{k_2}}......p_s^{{k_ ...
- GYM100633J. Ceizenpok’s formula 扩展lucas模板
J. Ceizenpok’s formula time limit per test 2.0 s memory limit per test 256 MB input standard input o ...
- BZOJ2142 礼物 扩展lucas 快速幂 数论
原文链接http://www.cnblogs.com/zhouzhendong/p/8110015.html 题目传送门 - BZOJ2142 题意概括 小E购买了n件礼物,送给m个人,送给第i个人礼 ...
随机推荐
- imx6q 添加intel PCIE网卡
TQ_IMX6Q开发板移植rtl8168-PCIE转千兆网卡 一.配置内核选项PCIE总线驱动支持 默认的内核配置可能没有把PCIE的总线驱动编入内核,所以需要确认是否把驱动编译到了内核里面. 配置好 ...
- pppoe白皮书
转:https://blog.csdn.net/achejq/article/details/19478811 PPPoE技术白皮书 关键词:PPP,Ethernet,PPPoE 摘 要:PPP ...
- iOS_网络编程
网络编程中有以下几种方式向服务器进行提交数据: IOS同步请求.异步请求.GET请求.POST请求 1.同步请求可以从因特网请求数据,一旦发送同步请求,程序将停止用户交互,直至服务器返回数据完成,才可 ...
- INSPIRED启示录 读书笔记 - 第6章 招聘产品经理
产品经理应有的特质 个人素质和态度:技术可以学习,素质却难以培养,有些素质是成功的产品经理必不可少的 对产品的热情:对产品有一种本能的热爱,是夜以继日克服困难.完善产品的动力 用户立场:能换位思考,能 ...
- 安装MySQL5.7.18遇到的坑
最近才注意到MySQL的各个版本之间差别还挺大的,比如5.5.x版本的timestamp类型列只能有一个设置为default CURRENT_TIMESTAMP的,于是尝试了换成一个新版本是mysql ...
- CCNA 课程 一
OSI 参考模型: 7应用层 6表示层 5会话层 4传输层 -- TCP / UDP (端口号) 3网络层 -- IP (原IP地址,目标IP地址) 2数据链路层 -- ARPA / e ...
- Kubernetes TLS认证
转自: https://mritd.me/2018/01/07/kubernetes-tls-bootstrapping-note/ 前段时间撸了一会 Kubernetes 官方文档,在查看 TLS ...
- MAC 系列 之XCode7.1 + HBuilder MUI 离线打包 ipa 上次application leader 问题:ERROR ITMS - 90032
90032 解决方法:
- Quartz实现定时任务实例
1首先实现Job接口,创建任务 public class HelloJob implements Job{ @Override public void execute(JobExecutionCont ...
- WPF各种控件详解——(WPF从我炫系列)
http://blog.csdn.net/zx13525079024/article/details/5694638