BZOJ - 2142 礼物 (扩展Lucas定理)
扩展Lucas定理模板题(貌似这玩意也只能出模板题了吧~~本菜鸡见识鄙薄,有待指正)
原理:
https://blog.csdn.net/hqddm1253679098/article/details/82897638
https://blog.csdn.net/clove_unique/article/details/54571216
感觉扩展Lucas定理和Lucas定理的复杂程度差了不止一个档次,用到了一大堆莫名其妙的函数。
另外谁能告诉我把一个很大的组合数对一个非质数取模有什么卵用
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=;
ll c[N],m[N],p[N],k[N],n,nn,mm[N],kk,pp; void exgcd(ll a,ll b,ll& x,ll& y,ll& g) {//扩展欧几里得
if(!b)x=,y=,g=a;
else exgcd(b,a%b,y,x,g),y-=x*(a/b);
}
ll inv(ll a,ll b) {//逆元
ll x,y,g;
exgcd(a,b,x,y,g);
return x%b;
}
ll Pow(ll a,ll b,ll mod) {//快速幂
ll ret=;
for(; b; b>>=,a=a*a%mod)if(b&)ret=ret*a%mod;
return ret;
}
ll fact(ll n,ll p,ll k) {//求n!去掉质因子p后对p^k取模的值
if(n==)return ;
ll mod=Pow(p,k,),ret=,cnt=n/mod;
for(ll i=; i<=mod; ++i)if(i%p)ret=ret*i%mod;
ret=Pow(ret,cnt,mod);
for(ll i=n-cnt*mod; i>=; --i)if(i%p)ret=ret*i%mod;
return ret*fact(n/p,p,k)%mod;
}
ll C(ll n,ll m,ll p,ll k) {//求C(n,m)对p^k取模的值
ll mod=Pow(p,k,);
ll ret=fact(n,p,k)*inv(fact(m,p,k),mod)%mod*inv(fact(n-m,p,k),mod)%mod;
ll cnt=;
for(ll i=p; i<=n; i*=p)cnt+=n/i;
for(ll i=p; i<=m; i*=p)cnt-=m/i;
for(ll i=p; i<=n-m; i*=p)cnt-=(n-m)/i;
if(cnt<)ret=ret*inv(Pow(p,-cnt,mod),mod)%mod;
else ret=ret*Pow(p,cnt,mod)%mod;
return ret;
}
ll CRT(ll* c,ll* m,ll n) {//扩展中国剩余定理
ll M=,C=,x,y,g;
for(ll i=; i<n; ++i) {
exgcd(M,m[i],x,y,g);
if((c[i]-C)%g)return -;
C=x%(m[i]/g)*((c[i]-C)/g)%(m[i]/g)*M+C;
M=M*m[i]/g,C%=M;
}
return (C%M+M)%M;
}
void split(ll x) {//唯一分解定理
n=;
for(ll i=; i*i<=x; ++i)if(x%i==) {
p[n]=i,k[n]=;
while(x%i==)x/=i,k[n]++;
n++;
}
if(x>)p[n]=x,k[n++]=;
}
ll C(ll nn,ll mm,ll P) {//计算C(nn,mm)%P
split(P);
for(ll i=; i<n; ++i)m[i]=Pow(p[i],k[i],),c[i]=C(nn,mm,p[i],k[i]);
return CRT(c,m,n);
}
ll solve() {
if(accumulate(mm,mm+kk,0ll)>nn)return -;
ll ret=;
for(ll i=; i<kk; ++i)ret=ret*C(nn,mm[i],pp)%pp,nn-=mm[i];
return ret;
}
int main() {
while(scanf("%lld",&pp)==) {
scanf("%lld%lld",&nn,&kk);
for(ll i=; i<kk; ++i)scanf("%lld",&mm[i]);
ll ans=solve();
if(!~ans)printf("Impossible\n");
else printf("%lld\n",ans);
}
return ;
}
BZOJ - 2142 礼物 (扩展Lucas定理)的更多相关文章
- bzoj 2142 礼物——扩展lucas模板
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2142 没给P的范围,但说 pi ^ ci<=1e5,一看就是扩展lucas. 学习材料 ...
- BZOJ.2142.礼物(扩展Lucas)
题目链接 答案就是C(n,m1) * C(n-m1,m2) * C(n-m1-m2,m3)...(mod p) 使用扩展Lucas求解. 一个很简单的优化就是把pi,pi^ki次方存下来,因为每次分解 ...
- [bzoj2142]礼物(扩展lucas定理+中国剩余定理)
题意:n件礼物,送给m个人,每人的礼物数确定,求方案数. 解题关键:由于模数不是质数,所以由唯一分解定理, $\bmod = p_1^{{k_1}}p_2^{{k_2}}......p_s^{{k_ ...
- Lucas定理和扩展Lucas定理
1.Lucas定理 首先给出式子:\(C_n^m\%p = C_{\lfloor\frac{n}{p}\rfloor}^{\lfloor\frac{m}{p}\rfloor} * C_{n\%p}^{ ...
- 2015 ICL, Finals, Div. 1 Ceizenpok’s formula(组合数取模,扩展lucas定理)
J. Ceizenpok’s formula time limit per test 2 seconds memory limit per test 256 megabytes input stand ...
- 【learning】 扩展lucas定理
首先说下啥是lucas定理: $\binom n m \equiv \binom {n\%P} {m\%P} \times \binom{n/P}{m/P} \pmod P$ 借助这个定理,求$\bi ...
- Ceizenpok’s formula Gym - 100633J 扩展Lucas定理 + 中国剩余定理
http://codeforces.com/gym/100633/problem/J 其实这个解法不难学的,不需要太多的数学.但是证明的话,我可能给不了严格的证明.可以看看这篇文章 http://ww ...
- [笔记] 扩展Lucas定理
[笔记] 扩展\(Lucas\)定理 \(Lucas\)定理:\(\binom{n}{m} \equiv \binom{n/P}{m/P} \binom{n \% P}{m \% P}\pmod{P} ...
- BZOJ 2142: 礼物 [Lucas定理]
2142: 礼物 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 1294 Solved: 534[Submit][Status][Discuss] ...
随机推荐
- iOS NSSet 学习 “无序数组” & 去重 案例
“NSSet,NSMutableSet,和NSCountedSet类声明编程接口对象的无序集合(散列存储:在内存中的存储位置不连续). 而NSArray,NSDictionary类声明编程接口对象的有 ...
- 安装好MySQL后就开始学习如何后台创建自己的数据库吧!
MySQL创建数据库的方式不像SQL Server那样有图形界面,而是使用DOS窗口创建的,接下来就是创建MySQL数据库的具体步骤. ↓↓↓↓↓↓↓↓ ↓↓↓↓↓↓↓↓ ↓↓↓↓ ...
- Java系列之EJB 理解
EJB = Enterprise Java Bean,它和JavaBean有本质的区别,最好不要将他们混淆起来,就像不要将Java和 Javascript混淆起来一样.EJB有3中类型:Session ...
- JS 中 Date() 的其他操作集锦
好吧,这周完全是个业务型的程序猿了,明显地能感觉到洗头发时头皮都会有点疼,是秃顶的前兆. 算得上收获的就是有较多的接触到计算时间方面的事件...嗯,几个笔记分享一下 // 处理 /Date(" ...
- java 跨数据库导入大数据
java 跨数据库导入大数据 /** * java程序跨服务器跨数据库批量导入导出百万级数据 * @param args * @throws Exception */ public static vo ...
- 5.4WEB服务器、应用程序服务器、HTTP服务器区别
WEB服务器.应用程序服务器.HTTP服务器有何区别?IIS.Apache.Tomcat.Weblogic.WebSphere都各属于哪种服务器,这些问题困惑了很久,今天终于梳理清楚了: Web服 ...
- UITableViewCell使用时注意事项
1,注意使用重用机制(有利于提高效率) 2,做到通过改变模型去间接改变UI样式(做到永久改变,无论怎样拖动刷新,都不会恢复改变) 3,在通过传递模型给Cell控件布局时,记得完全覆盖(嗯,不好解释,主 ...
- id和NSObject *和instanceType的区别与联系
id 被成为万能指针,也就是可以指向任何对象. NSObject * 本身就是定义指向NSObject类型的指针. 那么这两者有什么区别吗? 这两者都是既可以作为返回值,又可以作为变量修饰.而其主要区 ...
- webpack 从0 手动配置
1. npm init 2. npm install -D webpack webpack-cli 3. 创建webpack入口文件( 默认 webpack.config.js 可以通过 webpac ...
- nginx流量全copy记录
参考:http://tyrion.iteye.com/blog/2311987 准备两台服务器: 0.0.0.1 0.0.0.2 在 0.0.0.1上 . 下载 wget https://github ...