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个人礼 ...
随机推荐
- 【转载】linux获取mac地址
#include <stdio.h> #include <string.h> #include <sys/types.h> #include <sys/soc ...
- Django-Ajax进阶
一.Ajax上传文件 1.form表单上传文件 文件和其他的数据类型不一样,是一个二进制的形式 Form上传文件的时候切记要加上:enctype="multipart/form-data&q ...
- 跨平台移动开发 Xuijs超轻量级的框架+Emile CSS动画
Xuijs超轻量级的框架+Emile CSS动画效果图 示例代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional// ...
- python:字典的方法
1.查找字典中的key对应的值和key是否存在(get,has_key)dict.get(key, default = None) :返回字典中key对应的值,若key不存在字典中,则返回defaul ...
- mini2440移植uboot 2014.04(七)
上一篇博文:<mini2440移植uboot 2014.04(六)> 代码已经上传到github上: https://github.com/qiaoyuguo/u-boot-2014.04 ...
- INSPIRED启示录 读书笔记 - 第17章 产品人物角色
理解目标用户 人物角色又称为用户特征记录(user profile),是指通过与用户沟通交流,确定典型的目标用户类型,在理解各类目标用户的特征的基础上建立的人物原型 为了发掘潜在的人物角色,产品经理必 ...
- wampserver安装在服务器中,但是mysql不能远程登录的解决方案
利用mysql workbench或者Navicat连接服务器的mysql时,有时候会出现拒绝访问, 因为在mysql中没有赋予其他用户权限,只能本地登录,所以要进行设置. 设置如下: 打开mysql ...
- FIND_IN_SET的简单使用
FIND_IN_SET(str,strlist)函数 str 要查询的字符串 strlist 字段名 参数以”,”分隔 如 (1,2,6,8) 查询字段(strlist)中包含(str)的结果,返回结 ...
- R语言笔记004——R批量读取txt文件
R批量读取txt文件 本文数据,代码都是参考的是大音如霜公众号,只是自己跟着做了一遍. path<-'C:\\Users\\Administrator\\Desktop\\docs' docs& ...
- 格点多边形面积公式(Pick定理)的一个形象解释(转)
Pick定理:如果一个简单多边形(以下称为“多边形”)的每个顶点都是直角坐标平面上的格点,则称该多边形为格点多边形.若一个面积为S的格点多边形,其边界上有a个格点,内部有b个格点,则S=a/2+b-1 ...