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个人礼 ...
随机推荐
- Django-虚拟环境设置
Django 虚拟环境virtualenv virtualenv是用来处理多个用python语言进行开发的项目,在同一台机器上部署,不同项目依赖不同第三方库版本所造成的问题. 打个比方,现在你机器上要 ...
- mysql性能优化的一些建议
mysql性能优化的一些建议 1.EXPLAIN 你的 SELECT 查询 查看rows列可以让我们找到潜在的性能问题. 2.为关键字段添加索引,比如:where, order by, group b ...
- 高通Android display分析【转】
本文转载自:http://blog.csdn.net/zhangchiytu/article/details/6777039 高通7系列硬件架构分析 如上图,高通7系列 Display的硬件部分主要由 ...
- 2018-02-11 发布 spring 自定义注解(annotation)与 aop获取注解
知识点: Java自定义注解.spring aop @aspect的使用 首先我们先介绍Java自定义注解. 在开发过程中,我们实现接口的时候,会出现@Override,有时还会提示写@Suppres ...
- vue自定义事件 子组件把数据传出去
每个 Vue 实例都实现了事件接口(Events interface),即: 使用 $on(eventName) 监听事件 使用 $emit(eventName) 触发事件 1.使用v-on绑定自定义 ...
- poj 2115 C Looooops 扩展欧几里德
C Looooops Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 23616 Accepted: 6517 Descr ...
- js添加后缀防止缓存
jsp页面: 时间戳的话需要引入: <%@ page import="java.util.Date"%> <script type="text/java ...
- python中的一些编码问题
声明Python源码编码方式 在程序的开始写上:# -*- coding: utf-8 -*- # -*- coding: gbk -*- 注: decode是将其它编码方式转换成unicode编码 ...
- 包--R In Action
1.4 包R提供了大量开箱即用的功能,但它最激动人心的一部分功能是通过可选模块的下载和安装来实现的.目前有2500多个①称为包(package)的用户贡献模块可从http://cran.r-proje ...
- 小谈CSS定位
定义和用法 position 属性规定元素的定位类型. 说明 这个属性定义建立元素布局所用的定位机制.任何元素都可以定位,不过绝对或固定元素会生成一个块级框,而不论该元素本身是什么类型.相对定位元素会 ...