题目链接

答案就是C(n,m1) * C(n-m1,m2) * C(n-m1-m2,m3)...(mod p)

使用扩展Lucas求解。

一个很简单的优化就是把pi,pi^ki次方存下来,因为每次分解p都是很慢的。

注意最后p不为1要把p再存下来!(质数)

COGS 洛谷上的大神写得快到飞起啊QAQ 就这样吧

3.25 Update:预处理阶乘可以很快,别忘longlong。代码见下。

//836kb	288ms
#include <cmath>
#include <cstdio>
typedef long long LL; int cnt,P[500],PK[500];
LL FP(LL x,int k,LL p)
{
LL t=1ll;
for(; k; k>>=1,x=x*x%p)
if(k&1) t=t*x%p;
return t;
}
LL Exgcd(LL a,LL b,LL &x,LL &y)
{
if(!b) x=1,y=0;
else Exgcd(b,a%b,y,x),y-=a/b*x;
}
LL Inv(LL a,LL p)
{
LL x,y; Exgcd(a,p,x,y);
return (x%p+p)%p;
}
LL Fact(LL x,LL pi,LL pk)//Calc x! % (pk=pi^ki)(x!中无pi因子)
{
if(!x) return 1ll;
LL res=1ll;
if(x>=pk)
{
for(int i=2; i<pk; ++i)//从1开始没什么用
if(i%pi) (res*=i)%=pk;//无pi因子!
res=FP(res,x/pk,pk);
}
for(int i=2; i<=x%pk; ++i)
if(i%pi) (res*=i)%=pk;
return res*Fact(x/pi,pi,pk)%pk;
}
int C(LL n,LL m,LL pi,LL pk,LL mod)//int
{
if(n<m) return 0;
LL a=Fact(n,pi,pk),b=Fact(m,pi,pk),c=Fact(n-m,pi,pk);int k=0;
for(LL i=n; i; i/=pi) k+=i/pi;
for(LL i=m; i; i/=pi) k-=i/pi;
for(LL i=n-m; i; i/=pi) k-=i/pi;
LL res=a*Inv(b,pk)%pk*Inv(c,pk)%pk*FP(pi,k,pk)%pk;
return res*(mod/pk)%mod*Inv(mod/pk,pk)%mod;
}
LL Solve(int n,int m,int p)
{
if(!n) return 1ll;
int res=0;
for(int i=1; i<=cnt; ++i) (res+=C(n,m,P[i],PK[i],p))%=p;
return (LL)res;
} int main()
{
int n,m,p,t[9];
scanf("%d%d%d",&p,&n,&m);
int sum=0;
for(int i=1; i<=m; ++i) scanf("%d",&t[i]),sum+=t[i];
if(sum>n) {puts("Impossible"); return 0;}
int now=p;
for(int i=2,lim=sqrt(p+0.5); i<=lim; ++i)
if(!(now%i))
{
int pk=1;
while(!(now%i)) now/=i,pk*=i;
P[++cnt]=i, PK[cnt]=pk;
if(now==1) break;
}
if(now!=1) P[++cnt]=now,PK[cnt]=now;
LL res=1ll;
for(int i=1; i<=m; ++i) (res*=Solve(n,t[i],p))%=p,n-=t[i];
printf("%lld",res); return 0;
}

Update:

/*
1620kb 184ms
不预处理:836kb 288ms
答案就是C(n,m1)*C(n-m1,m2)*C(n-m1-m2,m3)...使用扩展Lucas求解。
一个很简单的优化就是把pi,pi^ki次方存下来,因为每次分解p都是很慢的。
注意最后p不为1要把p再存下来!(质数)
预处理阶乘。不想麻烦就开longlong。
*/
#include <cmath>
#include <cstdio>
typedef long long LL; int cnt,P[500],PK[500];
LL fac[100005];//开longlong!
LL FP(LL x,int k,LL p)
{
LL t=1ll;
for(; k; k>>=1,x=x*x%p)
if(k&1) t=t*x%p;
return t;
}
LL Exgcd(LL a,LL b,LL &x,LL &y)
{
if(!b) x=1,y=0;
else Exgcd(b,a%b,y,x),y-=a/b*x;
}
LL Inv(LL a,LL p)
{
LL x,y; Exgcd(a,p,x,y);
return (x%p+p)%p;
}
LL Fact(LL x,LL pi,LL pk)//Calc x! % (pk=pi^ki)(x!中无pi因子)
{
if(!x) return 1ll;
LL res=1ll;
if(x>=pk) res=FP(fac[pk],x/pk,pk);
res=res*fac[x%pk]%pk;
return res*Fact(x/pi,pi,pk)%pk;
}
int C(LL n,LL m,LL pi,LL pk,LL mod)//int
{
if(n<m) return 0;
fac[0]=1;
for(int i=1; i<=pk; ++i)
if(i%pi) fac[i]=1ll*fac[i-1]*i%pk;
else fac[i]=fac[i-1];
LL a=Fact(n,pi,pk),b=Fact(m,pi,pk),c=Fact(n-m,pi,pk);int k=0;
for(LL i=n; i; i/=pi) k+=i/pi;
for(LL i=m; i; i/=pi) k-=i/pi;
for(LL i=n-m; i; i/=pi) k-=i/pi;
LL res=a*Inv(b,pk)%pk*Inv(c,pk)%pk*FP(pi,k,pk)%pk;
return res*(mod/pk)%mod*Inv(mod/pk,pk)%mod;
}
LL Solve(int n,int m,int p)
{
if(!n) return 1ll;
int res=0;
for(int i=1; i<=cnt; ++i) (res+=C(n,m,P[i],PK[i],p))%=p;
return (LL)res;
} int main()
{
int n,m,p,t[9];
scanf("%d%d%d",&p,&n,&m);
int sum=0;
for(int i=1; i<=m; ++i) scanf("%d",&t[i]),sum+=t[i];
if(sum>n) {puts("Impossible"); return 0;}
int now=p;
for(int i=2,lim=sqrt(p+0.5); i<=lim; ++i)
if(!(now%i))
{
int pk=1;
while(!(now%i)) now/=i,pk*=i;
P[++cnt]=i, PK[cnt]=pk;
if(now==1) break;
}
if(now!=1) P[++cnt]=now,PK[cnt]=now;
LL res=1ll;
for(int i=1; i<=m; ++i) (res*=Solve(n,t[i],p))%=p,n-=t[i];
printf("%lld",res); return 0;
}

BZOJ.2142.礼物(扩展Lucas)的更多相关文章

  1. bzoj 2142 礼物——扩展lucas模板

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2142 没给P的范围,但说 pi ^ ci<=1e5,一看就是扩展lucas. 学习材料 ...

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

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

  3. BZOJ 2142: 礼物 [Lucas定理]

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

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

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

  5. BZOJ 2142 礼物 组合数学 CRT 中国剩余定理

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

  6. 【刷题】BZOJ 2142 礼物

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

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

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

  8. BZOJ2142 礼物 扩展lucas 快速幂 数论

    原文链接http://www.cnblogs.com/zhouzhendong/p/8110015.html 题目传送门 - BZOJ2142 题意概括 小E购买了n件礼物,送给m个人,送给第i个人礼 ...

  9. BZOJ 2142 礼物 数论

    这道题是求组合数终极版. C(n,m) mod P n>=1e9 m>=1e9 P>=1e9且为合数且piqi<=1e5 拓展lucas定理. 实际上就是一点数论小知识的应用. ...

随机推荐

  1. spring boot 分布式事务实现(XA方式)

    关于spring boot 支持分布式事务,XA是常用的一种方式. 这里把相关的配置记下,方便以后使用. 首先配置两个不同的数据源 : 订单库.持仓库. /** * Created by zhangj ...

  2. 使用easyui实现双击列表中某个值直接对其进行修改

    var editCell = undefined; $('#dg').datagrid({ url:'DwzServlet', iconCls:'icon icon-list' , queryPara ...

  3. JXL读取,写入Excel

    JXL读取,写入Excel2003 相关阅读:poi 读写excel2003:http://www.cnblogs.com/gavinYang/p/3576739.htmlpoi 读写excel200 ...

  4. SQL记录-PLSQL过程

    PL/SQL过程   子程序是一个程序单元/模块执行特定的任务.这些子程序被组合以形成更大的程序.这基本上是被称为“模块化设计”.子程序可以调用由另一个子程序或程序被称为调用程序. 子程序可以创建: ...

  5. Linux遇到的问题(一)Ubuntu报“xxx is not in the sudoers file.This incident will be reported” 错误解决方法

    提示错误信息 www@iZ236j3sofdZ:~$ ifconfig Command 'ifconfig' is available in '/sbin/ifconfig' The command ...

  6. Caffe 碎碎念

    Window Data Layer window data layer 的数据是存在硬盘上的图片, 需要在一个txt里指定用于训练或测试的图片以及bounding box, bounding box ...

  7. 月薪20K软件测试自动化岗必问面试题:验证码识别与处理

    本文乃Happy老师的得意门生来自java全栈自动化测试4期的小核桃所作.正所谓严师出高徒,笔下有黄金~~让我们一起来征服面试官吧~~ 在做自动化测试的时候,经常会遇到需要输入验证码的地方,有些可以让 ...

  8. HTTP协议之响应头Date与Age

    HTTP没有为用户提供一种手段来区分响应是缓存命中的,还是访问原始服务器得到的.客户端有一种方法能判断响应是否来自缓存,就是使用Date首部.将响应中Date首部的值与当前时间进行比较,如果响应中的日 ...

  9. E - 食物链

    题目链接:https://cn.vjudge.net/contest/66964#problem/E 关系式: ra->rb=(ra->b + b->rb )%3; ra->b ...

  10. 基础图像处理之混合空间增强——(Java:拉普拉斯锐化、Sobel边缘检测、均值滤波、伽马变换)

    相信看过冈萨雷斯第三版数字图像处理的童鞋都知道,里面涉及到了很多的基础图像处理的算法,今天,就专门借用其中一个混合空间增强的案例,来将常见的几种图像处理算法集合起来,看能发生什么样的化学反应 首先,通 ...