BZOJ.2142.礼物(扩展Lucas)
答案就是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)的更多相关文章
- bzoj 2142 礼物——扩展lucas模板
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2142 没给P的范围,但说 pi ^ ci<=1e5,一看就是扩展lucas. 学习材料 ...
- BZOJ - 2142 礼物 (扩展Lucas定理)
扩展Lucas定理模板题(貌似这玩意也只能出模板题了吧~~本菜鸡见识鄙薄,有待指正) 原理: https://blog.csdn.net/hqddm1253679098/article/details ...
- BZOJ 2142: 礼物 [Lucas定理]
2142: 礼物 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 1294 Solved: 534[Submit][Status][Discuss] ...
- [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] ...
- 【刷题】BZOJ 2142 礼物
Description 一年一度的圣诞节快要来到了.每年的圣诞节小E都会收到许多礼物,当然他也会送出许多礼物.不同的人物在小E 心目中的重要性不同,在小E心中分量越重的人,收到的礼物会越多.小E从商店 ...
- [bzoj2142]礼物(扩展lucas定理+中国剩余定理)
题意:n件礼物,送给m个人,每人的礼物数确定,求方案数. 解题关键:由于模数不是质数,所以由唯一分解定理, $\bmod = p_1^{{k_1}}p_2^{{k_2}}......p_s^{{k_ ...
- BZOJ2142 礼物 扩展lucas 快速幂 数论
原文链接http://www.cnblogs.com/zhouzhendong/p/8110015.html 题目传送门 - BZOJ2142 题意概括 小E购买了n件礼物,送给m个人,送给第i个人礼 ...
- BZOJ 2142 礼物 数论
这道题是求组合数终极版. C(n,m) mod P n>=1e9 m>=1e9 P>=1e9且为合数且piqi<=1e5 拓展lucas定理. 实际上就是一点数论小知识的应用. ...
随机推荐
- Linux 用户和组管理
这是用户和组管理的知识点,不想看文字就看视频吧,还是视频为主,文字为备忘录 视频链接: 项目1用户管理 1.创建一个新用户user01,设置其主目录为/home/user01: #useradd –d ...
- python BeautifulSoup
之前解析LXML,用的是XPath,现在临时被抓取写爬虫,接人家的代码,看到用的是BeautifulSoup,稍微学了下,也挺好用的,简单记录下用法,有机会做下和Xpath的对比测试 初始化 from ...
- bzoj千题计划221:bzoj1500: [NOI2005]维修数列(fhq treap)
http://www.lydsy.com/JudgeOnline/problem.php?id=1500 1.覆盖标记用INF表示无覆盖标记,要求可能用0覆盖 2.代表空节点的0号节点和首尾的两个虚拟 ...
- uva 10625 Board Wrapping
https://vjudge.net/problem/UVA-10652 给出n个长方形,用一个面积尽量小的凸多边形把他们围起来 求木板占包装面积的百分比 输入给出长方形的中心坐标,长,宽,以及长方形 ...
- WebSlides - 轻松制作漂亮的 HTML 幻灯片(演讲稿)
WebSlides 是一个开源的 HTML 幻灯片项目,能够帮助熟悉前端语言的开发者快速制作出效果精美的幻灯片.页面中的每个 <section> 都是一个独立的幻灯片,只需要很少的 CSS ...
- 雨林木风ghostwin7纯净版系统下载
雨林木风ghostwin7纯净版系统下载 关于easyuidatagrid的问题,跪求老司机带带我..... 关于cst_modesys/stat.h一个问题求解答谢谢 [程序]STM32使用SPI接 ...
- UVALive 7456 Least Crucial Node
题目链接 题意: 给定一个无向图,一个汇集点,问哪一个点是最关键的,如果有多个关键点,输出序号最小的那个. 因为数据量比较小,所以暴力搜索就行,每去掉一个点,寻找和汇集点相连的还剩几个点,以此确定哪个 ...
- 第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天 CTFramesetterCreateWithAttributedString
1. NSString *text = @"This\nis\nsome\nmulti-line\nsample\ntext."; UIFont *uiFont = [UIFont ...
- ajax函数说明
url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. type: 要求为String类型的参数,请求方式(post或get)默认为get.注意其他http请求方法,例如put和 ...