题目链接

答案就是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. 如何通过卡面标识区分SD卡的速度等级

    现在很多设备都可以插存储卡,而比较流行的就是SD(Secure Digital Memory Card)卡和Micro SD(原名TF,Trans-flash Card )卡,这两种卡主要就是尺寸不同 ...

  2. Docker CE的安装 与镜像加速

    Docker CE 的安装与镜像加速 Docker CE是docker的开源版本 CENTOS 安装Docker CE 系统要求: 操作系统需要使用centos7() centos-extras库 必 ...

  3. js 正则学习小记之匹配字符串字面量

    今天看了第5章几个例子,有点收获,记录下来当作回顾也当作分享. 关于匹配字符串问题,有很多种类型,今天讨论 js 代码里的字符串匹配.(因为我想学完之后写个语法高亮练手,所以用js代码当作例子) va ...

  4. HTML5 移动开发(CSS3设计移动页面样式)

    1.如何创建CSS样式表 2.CSS3的卓越特性 3.基于设备属性改变样式的媒体查询 4.如何使用属性改变元标签创建更美观移动页面   层叠样式表是移动WEB开发中的一个重要组成部分,本次分享将学到如 ...

  5. 20155314 2016-2017-2 《Java程序设计》第8周学习总结

    20155314 2016-2017-2 <Java程序设计>第8周学习总结 教材学习内容总结 了解NIO 会使用Channel.Buffer与NIO2 会使用日志API.国际化 会使用正 ...

  6. PHP扩展开发--编写一个helloWorld扩展

    为什么要用C扩展 C是静态编译的,执行效率比PHP代码高很多.同样的运算代码,使用C来开发,性能会比PHP要提升数百倍. 另外C扩展是在进程启动时加载的,PHP代码只能操作Request生命周期的数据 ...

  7. 关于Python IDLE reload(sys)后无法正常执行命令的原因

    转载自:http://blog.csdn.net/kxcfzyk/article/details/41414247?utm_source=tuicool&utm_medium=referral ...

  8. Linux TTY驱动--Uart_driver底层【转】

    转自:http://blog.csdn.net/sharecode/article/details/9196591 版权声明:本文为博主原创文章,未经博主允许不得转载. Linux 中将串口驱动进行了 ...

  9. Linux下USB转串口的驱动【转】

    转自:http://www.linuxidc.com/Linux/2011-02/32218.htm Linux发行版自带usb to serial驱动,以模块方式编译驱动,在内核源代码目录下运行Ma ...

  10. 利用 devcon.exe实现自动安装驱动(转)

    http://blog.csdn.net/u012814201/article/details/44919125 工作的原因打算通过devcon.exe实现自动打包的功能,由于之前一直在Linux那个 ...