扩展Lucas定理模板题(貌似这玩意也只能出模板题了吧~~本菜鸡见识鄙薄,有待指正)

原理:

https://blog.csdn.net/hqddm1253679098/article/details/82897638

https://blog.csdn.net/clove_unique/article/details/54571216

感觉扩展Lucas定理和Lucas定理的复杂程度差了不止一个档次,用到了一大堆莫名其妙的函数。

另外谁能告诉我把一个很大的组合数对一个非质数取模有什么卵用

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const ll N=;
  5. ll c[N],m[N],p[N],k[N],n,nn,mm[N],kk,pp;
  6.  
  7. void exgcd(ll a,ll b,ll& x,ll& y,ll& g) {//扩展欧几里得
  8. if(!b)x=,y=,g=a;
  9. else exgcd(b,a%b,y,x,g),y-=x*(a/b);
  10. }
  11. ll inv(ll a,ll b) {//逆元
  12. ll x,y,g;
  13. exgcd(a,b,x,y,g);
  14. return x%b;
  15. }
  16. ll Pow(ll a,ll b,ll mod) {//快速幂
  17. ll ret=;
  18. for(; b; b>>=,a=a*a%mod)if(b&)ret=ret*a%mod;
  19. return ret;
  20. }
  21. ll fact(ll n,ll p,ll k) {//求n!去掉质因子p后对p^k取模的值
  22. if(n==)return ;
  23. ll mod=Pow(p,k,),ret=,cnt=n/mod;
  24. for(ll i=; i<=mod; ++i)if(i%p)ret=ret*i%mod;
  25. ret=Pow(ret,cnt,mod);
  26. for(ll i=n-cnt*mod; i>=; --i)if(i%p)ret=ret*i%mod;
  27. return ret*fact(n/p,p,k)%mod;
  28. }
  29. ll C(ll n,ll m,ll p,ll k) {//求C(n,m)对p^k取模的值
  30. ll mod=Pow(p,k,);
  31. ll ret=fact(n,p,k)*inv(fact(m,p,k),mod)%mod*inv(fact(n-m,p,k),mod)%mod;
  32. ll cnt=;
  33. for(ll i=p; i<=n; i*=p)cnt+=n/i;
  34. for(ll i=p; i<=m; i*=p)cnt-=m/i;
  35. for(ll i=p; i<=n-m; i*=p)cnt-=(n-m)/i;
  36. if(cnt<)ret=ret*inv(Pow(p,-cnt,mod),mod)%mod;
  37. else ret=ret*Pow(p,cnt,mod)%mod;
  38. return ret;
  39. }
  40. ll CRT(ll* c,ll* m,ll n) {//扩展中国剩余定理
  41. ll M=,C=,x,y,g;
  42. for(ll i=; i<n; ++i) {
  43. exgcd(M,m[i],x,y,g);
  44. if((c[i]-C)%g)return -;
  45. C=x%(m[i]/g)*((c[i]-C)/g)%(m[i]/g)*M+C;
  46. M=M*m[i]/g,C%=M;
  47. }
  48. return (C%M+M)%M;
  49. }
  50. void split(ll x) {//唯一分解定理
  51. n=;
  52. for(ll i=; i*i<=x; ++i)if(x%i==) {
  53. p[n]=i,k[n]=;
  54. while(x%i==)x/=i,k[n]++;
  55. n++;
  56. }
  57. if(x>)p[n]=x,k[n++]=;
  58. }
  59. ll C(ll nn,ll mm,ll P) {//计算C(nn,mm)%P
  60. split(P);
  61. for(ll i=; i<n; ++i)m[i]=Pow(p[i],k[i],),c[i]=C(nn,mm,p[i],k[i]);
  62. return CRT(c,m,n);
  63. }
  64. ll solve() {
  65. if(accumulate(mm,mm+kk,0ll)>nn)return -;
  66. ll ret=;
  67. for(ll i=; i<kk; ++i)ret=ret*C(nn,mm[i],pp)%pp,nn-=mm[i];
  68. return ret;
  69. }
  70. int main() {
  71. while(scanf("%lld",&pp)==) {
  72. scanf("%lld%lld",&nn,&kk);
  73. for(ll i=; i<kk; ++i)scanf("%lld",&mm[i]);
  74. ll ans=solve();
  75. if(!~ans)printf("Impossible\n");
  76. else printf("%lld\n",ans);
  77. }
  78. return ;
  79. }

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)

    题目链接 答案就是C(n,m1) * C(n-m1,m2) * C(n-m1-m2,m3)...(mod p) 使用扩展Lucas求解. 一个很简单的优化就是把pi,pi^ki次方存下来,因为每次分解 ...

  3. [bzoj2142]礼物(扩展lucas定理+中国剩余定理)

    题意:n件礼物,送给m个人,每人的礼物数确定,求方案数. 解题关键:由于模数不是质数,所以由唯一分解定理, $\bmod  = p_1^{{k_1}}p_2^{{k_2}}......p_s^{{k_ ...

  4. Lucas定理和扩展Lucas定理

    1.Lucas定理 首先给出式子:\(C_n^m\%p = C_{\lfloor\frac{n}{p}\rfloor}^{\lfloor\frac{m}{p}\rfloor} * C_{n\%p}^{ ...

  5. 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 ...

  6. 【learning】 扩展lucas定理

    首先说下啥是lucas定理: $\binom n m \equiv \binom {n\%P} {m\%P} \times \binom{n/P}{m/P} \pmod P$ 借助这个定理,求$\bi ...

  7. Ceizenpok’s formula Gym - 100633J 扩展Lucas定理 + 中国剩余定理

    http://codeforces.com/gym/100633/problem/J 其实这个解法不难学的,不需要太多的数学.但是证明的话,我可能给不了严格的证明.可以看看这篇文章 http://ww ...

  8. [笔记] 扩展Lucas定理

    [笔记] 扩展\(Lucas\)定理 \(Lucas\)定理:\(\binom{n}{m} \equiv \binom{n/P}{m/P} \binom{n \% P}{m \% P}\pmod{P} ...

  9. BZOJ 2142: 礼物 [Lucas定理]

    2142: 礼物 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 1294  Solved: 534[Submit][Status][Discuss] ...

随机推荐

  1. jQuery:自学笔记(2)——jQuery选择器

    jQuery:自学笔记(2)——jQuery选择器 基本选择器 说明 jQuery的基本选择器与CSS的选择器相似: 实例 标签选择器 //使用标签选择器更改字体大小 $(div).css('font ...

  2. loadrunner之脚本篇——代理录制

    版本:Loadruner 11.0 A.PC端录制Web应用程序 步骤1:根据实际情况,选择对应的协议 本例中选择Web(HTTP/HTML),如下 步骤2:找到代理设置界面 点击 Start Rec ...

  3. iOS 学习如何声明私有变量和私有方法

    私有变量 首先来说 OC 中没有绝对的私有变量,这么说基于两点原因: 1可修改:   通过KVC  键值编码 来修改私有成员变量的值 2可读取 :  通过底层runtime 获取实例变量Ivar 对应 ...

  4. Vosio秘钥

    C2FG9-N6J68-H8BTJ-BW3QX-RM3B32NYF6-QG2CY-9F8XC-GWMBW-29VV8FJ2N7-W8TXC-JB8KB-DCQ7Q-7T7V3VXX6C-DN3HQ-3 ...

  5. INSPIRED启示录 读书笔记 - 第24章 平滑部署

    避免更新产品导致用户反感 毫无征兆地更新不必要的版本会令用户产生反感.不是所有用户都喜欢新版本的产品.用户产生反感主要有几个原因 1.事前没有收到更新通知,用户觉得措手不及 2.用户没时间学习.适应新 ...

  6. 如何去掉Intellij IDEA过多的警告 设置警告级别

    Intellij IDEA的代码提示系统很强大,根据严格的代码规范,包括简洁程度,运行效率,潜在bug提前发现等等给你做出了除编译器之外的大量额外提示.但这些提示有时会给我们带来困扰,比如弄的界面很乱 ...

  7. idea创建git分支

        此时只是在本地创建好了分支,修改源代码后add,commit将本地分支提交到远程仓库            分支已创建,其它成员此时就可以从git拉分支

  8. vs+mysql+ef配置方法

    这次的项目用的是MySQL数据库,但是ADO.NET实体数据模型默认是不支持MySQL数据库的,本文档将介绍如何让VS ADO.NET实体数据模型支持MySQL. 一.安装插件 1.VS插件 mysq ...

  9. java深入探究12-框架之Spring

    1.引入Spring 我们在搭建框架时常常会解决问题:对象创建,对象之间依赖关系如何处理,Spring就是来解决这类问题的:控制反转依赖注入 2.环境搭建 1)下载源码:其中3.0以下版本源码中有Sp ...

  10. centos 验证mysql的安装

    一.验证mysql是否安装 1.whereis mysql:如果安装了mysql就会显示mysql安装的地址 2.which mysql:查看文件的运行地址 3.chkconfig --list my ...