2142: 礼物

Description

  1. 一年一度的圣诞节快要来到了。每年的圣诞节小E都会收到许多礼物,当然他也会送出许多礼物。不同的人物在小E心目中的重要性不同,在小E心中分量越重的人,收到的礼物会越多。小E从商店中购买了n件礼物,打算送给m个人,其中送给第i个人礼物数量为wi。请你帮忙计算出送礼物的方案数(两个方案被认为是不同的,当且仅当存在某个人在这两种方案中收到的礼物不同)。由于方案数可能会很大,你只需要输出模P后的结果。

Input

  1. 输入的第一行包含一个正整数P,表示模;
  2. 第二行包含两个整整数nm,分别表示小E从商店购买的礼物数和接受礼物的人数;
  3. 以下m行每行仅包含一个正整数wi,表示小E要送给第i个人的礼物数量。

Output

  1. 若不存在可行方案,则输出“Impossible”,否则输出一个整数,表示模P后的方案数。

数据规模和约定

设 $ P = \prod_{i=1}^n p_i^{c_i} $ 且 $ p_i $ 为质数

$1 \leqslant n \leqslant 10^9,1 \leqslant m \leqslant 5,1 \leqslant p_i^{c_i} \leqslant 10^5 $。

拓展卢卡斯和中国剩余定理的裸题

题目可以转换为求

\[\prod_{i=1}^n C_{n- \sum_{j=0}^{i-1} w[j]}^{w[i]}
\]

剩下的就是求 $ C_n^m % p $ 的问题了。

因为n,m,p都很大,所以我们可以使用拓展卢卡斯求出对于每个 $ p_i^{c_i} $ 余数,然后通过中国剩余定理合并即可。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define REP(i,st,ed) for(register int i=st,i##end=ed;i<=i##end;++i)
  4. #define DREP(i,st,ed) for(register int i=st,i##end=ed;i>=i##end;--i)
  5. #define pii pair<ll,ll>
  6. typedef long long ll;
  7. inline int read(){
  8. int x;
  9. char c;
  10. int f=1;
  11. while((c=getchar())!='-' && (c<'0' || c>'9'));
  12. if(c=='-') c=getchar(),f=-1;
  13. x=c^'0';
  14. while((c=getchar())>='0' && c<='9') x=(x<<1)+(x<<3)+(c^'0');
  15. return x*f;
  16. }
  17. inline ll readll(){
  18. ll x;
  19. char c;
  20. ll f=1;
  21. while((c=getchar())!='-' && (c<'0' || c>'9'));
  22. if(c=='-') c=getchar(),f=-1;
  23. x=c^'0';
  24. while((c=getchar())>='0' && c<='9') x=(x<<1ll)+(x<<3ll)+(c^'0');
  25. return x*f;
  26. }
  27. vector<pii> vc;
  28. ll ksm(ll x,ll y,ll mod){
  29. ll res=1;
  30. while(y){
  31. if(y&1ll) res=res*x%mod;
  32. x=x*x%mod;
  33. y>>=1ll;
  34. }
  35. return res;
  36. }
  37. ll exgcd(ll &x,ll &y,ll a,ll b){
  38. if(!b){
  39. x=1,y=0;
  40. return a;
  41. }
  42. ll res=exgcd(y,x,b,a%b);
  43. y-=a/b*x;
  44. return res;
  45. }
  46. ll inv(ll a,ll b){
  47. a%=b;
  48. ll x,y;
  49. exgcd(x,y,a,b);
  50. x=(x%b+b)%b;
  51. if(!x) x+=b;
  52. return x;
  53. }
  54. ll fac(ll x,ll u,ll mod){
  55. if(!x || x==1) return 1;
  56. ll ans=1,num=1;
  57. if(x/mod){
  58. for(ll i=2;i<mod;++i)
  59. if(i%u) num=num*i%mod;
  60. ans=ans*ksm(num,x/mod,mod);
  61. }
  62. ans=ans*fac(x/u,u,mod)%mod;
  63. x%=mod;
  64. for(ll i=2;i<=x;++i)
  65. if(i%u) ans=ans*i%mod;
  66. return ans;
  67. }
  68. ll calc(ll x,ll u){
  69. ll res=0;
  70. for(;x;x/=u) res+=x/u;
  71. return res;
  72. }
  73. ll C(ll n,ll m,ll u,ll v){
  74. ll x=fac(n,u,v),y=fac(m,u,v),z=fac(n-m,u,v);
  75. // cout<<n<<' '<<m<<' '<<v<<' '<<x<<' '<<y<<' '<<z<<endl;
  76. ll num=calc(n,u)-calc(m,u)-calc(n-m,u);
  77. x=x*inv(y,v)%v*inv(z,v)%v;
  78. return x*ksm(u,num,v)%v;
  79. }
  80. ll exLucas(ll n,ll m,ll mod){
  81. if(m>n) return 0;
  82. ll ans=0;
  83. REP(i,0,vc.size()-1){
  84. pii u=vc[i];
  85. ll x=u.first,y=u.second;
  86. ans=(ans+inv(mod/y,y)*(mod/y)%mod*C(n,m,x,y)%mod)%mod;
  87. }
  88. return ans;
  89. }
  90. int main(){
  91. #ifndef ONLINE_JUDGE
  92. freopen("china.in","r",stdin);
  93. freopen("china.out","w",stdout);
  94. #endif
  95. ll mod=readll(),n=readll(),ans=1;
  96. int m=read(),u=mod;
  97. for(ll i=2;i*i<=u;++i){
  98. if(u%i) continue;
  99. ll x=1;
  100. while(u%i==0) u/=i,x*=i;
  101. vc.push_back(make_pair(i,x));
  102. // cout<<i<<' '<<x<<endl;
  103. }
  104. if(u!=1) vc.push_back(make_pair(u,u));
  105. // cout<<u<<endl;
  106. REP(i,1,m){
  107. ll x=readll();
  108. ans=ans*exLucas(n,x,mod)%mod;
  109. if(!ans){
  110. printf("Impossible\n");
  111. return 0;
  112. }
  113. n-=x;
  114. }
  115. printf("%lld\n",ans);
  116. return 0;
  117. }

bzoj2142: 礼物的更多相关文章

  1. BZOJ2142 礼物 扩展lucas 快速幂 数论

    原文链接http://www.cnblogs.com/zhouzhendong/p/8110015.html 题目传送门 - BZOJ2142 题意概括 小E购买了n件礼物,送给m个人,送给第i个人礼 ...

  2. [BZOJ2142]礼物(扩展Lucas)

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

  3. BZOJ2142礼物——扩展卢卡斯

    题目描述 一年一度的圣诞节快要来到了.每年的圣诞节小E都会收到许多礼物,当然他也会送出许多礼物.不同的人物在小E 心目中的重要性不同,在小E心中分量越重的人,收到的礼物会越多.小E从商店中购买了n件礼 ...

  4. BZOJ2142 礼物 【扩展Lucas】

    题目 一年一度的圣诞节快要来到了.每年的圣诞节小E都会收到许多礼物,当然他也会送出许多礼物.不同的人物在小E 心目中的重要性不同,在小E心中分量越重的人,收到的礼物会越多.小E从商店中购买了n件礼物, ...

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

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

  6. BZOJ2142: 礼物(拓展lucas)

    Description 一年一度的圣诞节快要来到了.每年的圣诞节小E都会收到许多礼物,当然他也会送出许多礼物.不同的人物在小E 心目中的重要性不同,在小E心中分量越重的人,收到的礼物会越多.小E从商店 ...

  7. bzoj2142 礼物——扩展卢卡斯定理

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2142 前几天学了扩展卢卡斯定理,今天来磕模板! 这道题式子挺好推的(连我都自己推出来了) , ...

  8. 【BZOJ2142】礼物(拓展卢卡斯定理)

    [BZOJ2142]礼物(拓展卢卡斯定理) 题面 BZOJ 洛谷 题解 显然如果\(\sum w_i>n\)无解. 否则答案就是:\(\displaystyle \prod_{i=1}^m{n- ...

  9. 【BZOJ2142】礼物 组合数+CRT

    [BZOJ2142]礼物 Description 小E从商店中购买了n件礼物,打算送给m个人,其中送给第i个人礼物数量为wi.请你帮忙计算出送礼物的方案数(两个方案被认为是不同的,当且仅当存在某个人在 ...

随机推荐

  1. security相关链接整理

    token令牌 ssl协议 https协议 对称加密与非对称加密 认识ASP.NET Windows身份认证

  2. CF1070L Odd Federalization 高斯消元

    传送门 \(r = 1\)直接判断所有点度数是否为偶数 考虑\(r = 2\)的情况.设\(x_i=0/1\)表示\(i\)点所在的集合,那么若\(2 \mid du_u\),则\(\bigoplus ...

  3. 创建一个Scalar-valued Function函数来实现LastIndexOf

    昨天有帮助网友解决的个字符串截取的问题,<截取字符串中最后一个中文词语(MS SQL)>http://www.cnblogs.com/insus/p/7883606.html 虽然实现了, ...

  4. 如何构造树状 JSON 数据 JSON-Tree

    十年河东,十年河西,莫欺骚年穷...打错一个字哈.~_~ 接着上一篇博客,上一篇博客是=使用数据库结合LINQ构造的,为了方便理解,本篇采用泛型分组进行构造. 有兴趣的小虎斑可以参考上一篇博客:如何构 ...

  5. 关于小程序登录时获取openId和unionId走过的坑

    目前的项目是在做小程序这方面的,接触过的人应该都知道,同一个微信开放平台下的相同主体的App.公众号.小程序的unionid是相同的,这样就可以锁定是不是同一个用户.微信针对不同的用户在不同的应用下都 ...

  6. Luogu P1966 火柴排队

    这还是一道比较简单的题目,稍微想一下就可以解决.终于有NOIP难度的题目了 首先我们看那个∑(ai-bi)^2的式子,发现这个的最小值就是排序不等式 所以我们只需要改变第一组火柴的顺序,使它和第二组火 ...

  7. ORA-12638:Credential retrieval failed(身份证明检索失败)解决方法

    版本:oracle 11g 解决方法: 在sqlnet.ora中设置SQLNET.AUTHENTICATION_SERVICES= 0.本人亲自验证,可以解决此问题. 网上说设置SQLNET.AUTH ...

  8. 配置Nginx反向代理WebSocket,以代理noVNC为例

    什么是Nginx Nginx (engine x) 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器. Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮 ...

  9. Linux内核分析第七周总结

    第七章 可执行程序的装载 可执行程序的生成 可执行程序的生成: c语言代码--->经过编译器的预处理--->编译成汇编代码--->由汇编器编译成目标代码--->链接成可执行文件 ...

  10. pandas获取groupby分组里最大值所在的行,获取第一个等操作

    pandas获取groupby分组里最大值所在的行 10/May 2016 python pandas pandas获取groupby分组里最大值所在的行 如下面这个DataFrame,按照Mt分组, ...