题目链接

答案就是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. Linux 用户和组管理

    这是用户和组管理的知识点,不想看文字就看视频吧,还是视频为主,文字为备忘录 视频链接: 项目1用户管理 1.创建一个新用户user01,设置其主目录为/home/user01: #useradd –d ...

  2. python BeautifulSoup

    之前解析LXML,用的是XPath,现在临时被抓取写爬虫,接人家的代码,看到用的是BeautifulSoup,稍微学了下,也挺好用的,简单记录下用法,有机会做下和Xpath的对比测试 初始化 from ...

  3. bzoj千题计划221:bzoj1500: [NOI2005]维修数列(fhq treap)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1500 1.覆盖标记用INF表示无覆盖标记,要求可能用0覆盖 2.代表空节点的0号节点和首尾的两个虚拟 ...

  4. uva 10625 Board Wrapping

    https://vjudge.net/problem/UVA-10652 给出n个长方形,用一个面积尽量小的凸多边形把他们围起来 求木板占包装面积的百分比 输入给出长方形的中心坐标,长,宽,以及长方形 ...

  5. WebSlides - 轻松制作漂亮的 HTML 幻灯片(演讲稿)

    WebSlides 是一个开源的 HTML 幻灯片项目,能够帮助熟悉前端语言的开发者快速制作出效果精美的幻灯片.页面中的每个 <section> 都是一个独立的幻灯片,只需要很少的 CSS ...

  6. 雨林木风ghostwin7纯净版系统下载

    雨林木风ghostwin7纯净版系统下载 关于easyuidatagrid的问题,跪求老司机带带我..... 关于cst_modesys/stat.h一个问题求解答谢谢 [程序]STM32使用SPI接 ...

  7. UVALive 7456 Least Crucial Node

    题目链接 题意: 给定一个无向图,一个汇集点,问哪一个点是最关键的,如果有多个关键点,输出序号最小的那个. 因为数据量比较小,所以暴力搜索就行,每去掉一个点,寻找和汇集点相连的还剩几个点,以此确定哪个 ...

  8. 第11月第14天 opengl yuv beginners-tutorials

    1. Here is some snippets of code from my project 'movie player for iOS'. 1. fragment shader varying ...

  9. 第9月第9天 CTFramesetterCreateWithAttributedString

    1. NSString *text = @"This\nis\nsome\nmulti-line\nsample\ntext."; UIFont *uiFont = [UIFont ...

  10. ajax函数说明

    url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. type: 要求为String类型的参数,请求方式(post或get)默认为get.注意其他http请求方法,例如put和 ...