先求出式子$P_{C_{K+m-1}^{m}}^{n}$,然后对于排列直接$O(n)$求解,对于组合用扩展Lucas求解。

但这题数据并没有保证任何一个模数的质因子的$p^k$在可线性处理的范围内,于是并不会标准解法,只会面向数据编程。

数据中保证了如果某个质因子p的次数不为1,则它的$p^k$一定在可线性处理的范围内,于是只要特判次数为1的质数即可。

次数为1就可以直接求逆元$O(m)$处理了,于是问题解决,虽然随便出组数据就能卡掉。

 1 #include<cstdio>
 2 #include<algorithm>
 3 #define rep(i,l,r) for (ll i=(l); i<=(r); i++)
 4 typedef long long ll;
 5 using namespace std;
 6
 7 const int N=100010;
 8 ll n,m,K,P,tot,num[N],pi[N],pk[N],sm[N];
 9
10 ll ksm(ll a,ll b,ll p){
11     ll res=1;
12     for (; b; a=a*a%p,b>>=1)
13         if (b & 1) res=res*a%p;
14     return res;
15 }
16
17 void exgcd(ll a,ll b,ll &x,ll &y){
18     if (!b){ x=1; y=0; return; }
19         else exgcd(b,a%b,y,x),y-=a/b*x;
20 }
21
22 ll inv(ll a,ll p){ ll x,y; exgcd(a,p,x,y); return (x%p+p)%p; }
23
24 ll F(ll n,ll pi,ll pk){ return n ? ksm(sm[pk],n/pk,pk)*sm[n%pk]%pk*F(n/pi,pi,pk)%pk : 1; }
25
26 ll exLucas(ll n,ll m,ll pi,ll pk){
27     if (n<m) return 0;
28     sm[0]=sm[1]=1; rep(i,2,pk) sm[i]=sm[i-1]*((i%pi)?i:1)%pk;
29     ll a=F(n,pi,pk),b=F(m,pi,pk),c=F(n-m,pi,pk),k=0;
30     for (ll i=n; i; i/=pi) k+=i/pi;
31     for (ll i=m; i; i/=pi) k-=i/pi;
32     for (ll i=n-m; i; i/=pi) k-=i/pi;
33     return a*inv(b*c%pk,pk)%pk*ksm(pi,k,pk)%pk;
34 }
35
36 ll CRT(ll r[],ll m[]){
37     ll res=0;
38     rep(i,1,tot) res=(res+P/m[i]*inv(P/m[i],m[i])%P*r[i])%P;
39     return res;
40 }
41
42 void Frac(ll n){
43     tot=0;
44     for (ll i=2; i*i<=n; i++) if (n%i==0){
45         pi[++tot]=i; pk[tot]=i; n/=i;
46         while (n%i==0) n/=i,pk[tot]=pk[tot]*i;
47     }
48     if (n>1) pi[++tot]=n,pk[tot]=n;
49 }
50
51 ll Pe(ll n,ll m,ll P){ ll res=1; rep(i,1,m) res=res*(n-i+P+1)%P; return res; }
52
53 int main(){
54     scanf("%lld%lld%lld%lld",&n,&m,&K,&P);
55     Frac(P); ll res=0;
56     rep(i,1,tot){
57         ll s=1;
58         if (pi[i]==pk[i] && pi[i]>m)
59             rep(j,1,m) s=s*(K+m-j)%pi[i]*ksm(j,pi[i]-2,pi[i])%pi[i];
60         else s=exLucas(K+m-1,m,pi[i],pk[i]);
61         s=Pe(s,n,pi[i]); res=(res+P/pi[i]*inv(P/pi[i],pi[i])%P*s)%P;
62     }
63     printf("%lld\n",res);
64     return 0;
65 }

转载于:https://www.cnblogs.com/HocRiser/p/9965709.html

[BZOJ4338][BJOI2015]糖果(扩展Lucas)相关推荐

  1. BZOJ 4338 糖果(扩展Lucas定理+CRT)

    题目链接:BZOJ 4338 题目大意:用数字1~k填一个n*m的表格,每种数字可用任意次,要求每行数字1~m列单调不减,任意两行不完全相同,求方案数对P取模的值. 题解:扩展Lucas+CRT模板题 ...

  2. bzoj 4338: BJOI2015 糖果

    4338: BJOI2015 糖果 Time Limit: 2 Sec  Memory Limit: 256 MB Submit: 200  Solved: 93 [Submit][Status][D ...

  3. 4338: BJOI2015 糖果

    4338: BJOI2015 糖果 Time Limit: 2 Sec  Memory Limit: 256 MB Submit: 141  Solved: 66 [Submit][Status][D ...

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

  5. [学习笔记]扩展LUCAS定理

    可以先做这个题[SDOI2010]古代猪文 此算法和LUCAS定理没有半毛钱关系. [模板]扩展卢卡斯 不保证P是质数. $C_n^m=\frac{n!}{m!(n-m)!}$ 麻烦的是分母. 如果互 ...

  6. Lucas定理与扩展Lucas

    之前看了乘法逆元(详见除法取模与逆元),发现不能处理不互质的情况,于是去找方法,最后找到了Lucas定理... 虽然与期待中的不一样,但是还是非常有用的. (1)Lucas定理: 若p为素数,则有: ...

  7. Lucas定理扩展Lucas

    Lucas定理 求解 C n m m o d    p C_n^m\mod p Cnm​modp (p为素数) 蒟蒻不会证明,记着递推公式就好=_= L u c a s ( n , m ) = C ( ...

  8. bzoj 4338[BJOI2015] 糖果 - 组合

    4338: BJOI2015 糖果 Time Limit: 2 Sec  Memory Limit: 256 MB Description Alice 正在教她的弟弟 Bob 学数学.  每天,Ali ...

  9. 专题·Lucas定理【including Lucas定理,扩展Lucas

    初见安~这里是数论专题(6)[详见数论专栏 本篇有前置知识点需要掌握,建议先了解下:费马小定理,中国剩余定理,乘法逆元 一.Lucas定理 Lucas定理用于求解的组合数取模的问题.其中p为质数. 组 ...

最新文章

  1. python---random模块使用详解
  2. [转]分布式文件系统 MogileFS 安装手册
  3. 3.软件开发的本质和基本手段
  4. Linux 获取设备树源文件(DTS)里描述的资源
  5. linux中怎样获得进程描述符,linux进程学习-进程描述符,控制块
  6. iOS-多线程 ,整理集锦,多种线程的创建
  7. 1 课外笔记之网页动画——jsp系列问题
  8. java单终端登陆_配置终端服务单一登录
  9. linux限制ping的时间,如何限制Linux命令程序运行的时间
  10. 一个server搭建多个tomcat的时候session混乱情况及解决
  11. BigDecimal你遇见过哪些坑?
  12. 通过升级.NET框架提升实体框架性能
  13. 那些不开源的公司,后来怎么样了?
  14. HDU - 2091 空心三角形 水题,但是有点坑...
  15. java 沙盒模拟支付_网站对接paypal支付接口记录
  16. TCP/IP 协议大致的概念
  17. 网页自动填表html,韶关网页自动填表基础教程从简单开始 - MutouSoft - 时间财富网...
  18. 刨根系列之volatile详解
  19. 理解什么叫“自然拼读”
  20. 大疆aeb连拍_不适合航拍?不如深度发掘大疆spark拍照功能

热门文章

  1. 虚处立基 实处见效——2016中国可穿戴在线展会今日开幕
  2. 浩辰CAD中绘制断轴和圆柱相贯线的操作教程
  3. 国开计算机应用基础模块4实操题答案,国开电大计算机应用基础作业3 模块4 PowerPoint 2010实操题答案...
  4. Springboot 读取模板excel信息内容并发送邮件, 并不是你想想中的那么简单
  5. 别让“来电显示费”变成“呼吸税”
  6. 在微型计算机中麦克风属于,2017年9月计算机一级MSOffice考前模拟选择题训练(3)...
  7. Error:default argument given for parameter 2 of……
  8. python中format的用法-python format用法详解
  9. JS逆向教程:Python采集今日头条视频
  10. 已知某一天的日出时间和日落时间,分别保存在两个字符串中,求这个白天一共有几小时几分