拓展Lucas小结
拓展Lucas是解决大组合数取模非质数(尤其是含平方因子的合数)问题的有力工具...
首先对模数质因数分解,把每个质因子单独拎出来处理答案,然后用中国剩余定理(excrt)合并
问题转化为,对于每个质因子p,求$C_{n}^{m}(mod\;p^k)$
把$C_{n}^{m}$展开成$\frac{n!}{m!(n-m)!}$,发现上下的阶乘里,都可能有质因子p,把它们从阶乘里提取出来,额外求出$n!$里p的数量,减掉$m!$和$(n-m)!$里p的数量,再乘回答案里
剩余的部分就是$n!$,$m!$和$(n-m)!$去掉p的部分,因为它们都关于模数$p^k$互质,除以$m!$和$(n-m)!$就可以用exgcd求逆元了
现在剩余的任务就是处理$n!$去掉所有p的剩余部分
比如n=19,p=3,k=2时
剩余$1*2*4*5*7*8*10*11*13*14*16*17*19(mod\;3^2)$
略微变形成$(1*2*4*5*7*8)*(10*11*13*14*16*17)*19(mod\;3^2)$
发现它竟然是一个又一个循环节,循环节长度为$p^k$,而且每一个循环节都是同模的,所以计算出一个循环节的答案,再用快速幂求得所有循环节相乘的答案
对于每个循环节,递归求解即可
每次计算还会剩余长度小于循环节一小段,因为它长度小于$p^k$,暴力计算就行了
最后合并每个质因子的答案即可模数
时间非常玄学,由出题人的毒瘤程度模数决定
代码好长啊
namespace exlucas{
ll ans=,M=;
ll son[],pw[];
int num;
int excrt_ins(ll A,ll B)
{
ll a=A,b=B,c=(a-ans%b+b)%b,x,y;
ll g=exgcd(M,b,x,y);ll bg=b/g;
if(c%g!=) return -;
//x=x*(c/g)%bg;
x=qmul(x,c/g,bg);
ans+=x*M,M*=bg,ans=(ans%M+M)%M;
return ;
}
ll get_mul(ll n,ll p,ll &sum,const ll &mo,int type)
{
if(n==) return ;
ll ans=;
for(int i=;i<=min(n,mo);i++)
if(i%p) ans=ans*i%mo;
ans=qpow(ans,n/mo,mo);
for(int i=;i<=n%mo;i++)
if(i%p) ans=ans*i%mo;
sum+=1ll*(n/p)*type;
return ans*get_mul(n/p,p,sum,mo,type)%mo;
}
ll get_C(ll n,ll m,ll p,const ll &mo)
{
if(m>n) return ;
ll sum=;ll y;
ll nn=get_mul(n,p,sum,mo,);
ll mm=get_mul(m,p,sum,mo,-);
ll nm=get_mul(n-m,p,sum,mo,-);
exgcd(mm,mo,mm,y);
mm=(mm%mo+mo)%mo;
exgcd(nm,mo,nm,y);
nm=(nm%mo+mo)%mo;
return nn*mm%mo*nm%mo*qpow(p,sum,mo)%mo;
}
ll C(ll n,ll m,const ll &mo)
{
if(m>n) return ;
ll ret=;
for(int i=;i<num;i++){
ll val=get_C(n,m,son[i],pw[i]);
excrt_ins(val,pw[i]);
}
ret=ans,M=,ans=;
return ret;
}
};
拓展Lucas小结的更多相关文章
- 数学:拓展Lucas定理
拓展Lucas定理解决大组合数取模并且模数为任意数的情况 大概的思路是把模数用唯一分解定理拆开之后然后去做 然后要解决的一个子问题是求模质数的k次方 将分母部分转化成逆元再去做就好了 这里贴一份别人的 ...
- 【拓展Lucas】模板
求\(C_n^m \mod p\),写得太丑了qwq. 第一次写拓展Lucas竟然是在胡策的时候qwq写了两个半小时啊_(:з」∠)还写挂了一个地方qwq 当然今天胡策我也是第一次写中国剩余定理(ˇˍ ...
- 【bzoj2142】【礼物】拓展Lucas定理+孙子定理
(上不了p站我要死了,侵权度娘背锅) Description 一年一度的圣诞节快要来到了.每年的圣诞节小E都会收到许多礼物,当然他也会送出许多礼物.不同的人物在小E 心目中的重要性不同,在小E心中分量 ...
- BZOJ 3129 [SDOI2013]方程 (拓展Lucas)
题目大意:给定一个方程$X_{1}+X_{2}+X_{3}+X_{4}+...+X_{n}=M$,$\forall X_{i}<=A_{i} (i<=n1)$ $\forall X_{i} ...
- BZOJ2142: 礼物(拓展lucas)
Description 一年一度的圣诞节快要来到了.每年的圣诞节小E都会收到许多礼物,当然他也会送出许多礼物.不同的人物在小E 心目中的重要性不同,在小E心中分量越重的人,收到的礼物会越多.小E从商店 ...
- 拓展lucas结论及模板
lucas及其拓展 模板题 洛谷 P4720 本文侧向结论和代码实现, 推导请转至lucas定理及其拓展的推导 https://blog.csdn.net/yuyilahanbao/article/d ...
- 『Lucas定理以及拓展Lucas』
Lucas定理 在『组合数学基础』中,我们已经提出了\(Lucas\)定理,并给出了\(Lucas\)定理的证明,本文仅将简单回顾,并给出代码. \(Lucas\)定理:当\(p\)为质数时,\(C_ ...
- 【BZOJ-2142】礼物 拓展Lucas定理
2142: 礼物 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 1313 Solved: 541[Submit][Status][Discuss] ...
- [luogu4478 BJWC2018] 上学路线 (容斥原理+拓展lucas)
传送门 Description 小B 所在的城市的道路构成了一个方形网格,它的西南角为(0,0),东北角为(N,M). 小B 家住在西南角,学校在东北角.现在有T 个路口进行施工,小B 不能通过这些路 ...
随机推荐
- CDR 2017压感笔和压感设备该怎么设置使用?
您可以通过CorelDRAW 2017 中的以下工具来运用压感笔.笔或其他设备的压力:艺术笔(表达模式).橡皮擦.涂抹.转动.吸引.排斥.粗糙和弄脏.此外,您还可以通过艺术笔(表达模式)工具.橡皮擦. ...
- 再生龙恢复分区后修复引导或debian linux修复引导 三部曲
先参考 sudo -imkdir /mntmount /dev/sda1 /mntgrub-install --force --no-floppy --root-directory=/mnt /dev ...
- 洛谷T47092 作业_简单状压动归
只要注意一下细节就毫无难点了,简简单单状态压缩即可. Code: #include<cstdio> #include<algorithm> using namespace st ...
- webpack——react
这里记录了webpack在react中的简单运用 npx create-react-app 项目名 创建一个新项目 npm run build serve -s build
- [Codeforces 115E]Linear Kingdom Races
题目大意: 有n块地,初始是荒地.你可以把某些荒地开垦(需要花费相应的价值\(a_i\)(正整数)),然后这些荒地就可以种田. 现在有m年,每年要在l到r区间内种田,获得p(正整数)的价值(必须保证l ...
- BZOJ 2342 [SHOI2011]双倍回文 (回文自动机)
题目大意:略 先建出$PAM$ 因为双倍回文串一定是4的倍数,所以找出$PAM$里所有$dep$能整除4的节点 看这个串是否存在一个回文后缀,长度恰好为它的一半,沿着$pre$链往上跳就行了 暴跳可能 ...
- 【Python 学习】通过while循环和for循环猜测年龄
Python中可以通过while和for循环来限制猜测年龄的次数 1. 在猜测年龄的小程序中,不加循环的代码是这样的: age_of_yu = 23 guess_age = int(input(&qu ...
- Python 爬虫练习: 爬取百度贴吧中的图片
背景:最近开始看一些Python爬虫相关的知识,就在网上找了一些简单已与练习的一些爬虫脚本 实现功能:1,读取用户想要爬取的贴吧 2,读取用户先要爬取某个贴吧的页数范围 3,爬取每个贴吧中用户输入的页 ...
- SpringMVC上传文件(图片)并保存到本地
SpringMVC上传文件(图片)并保存到本地 小记一波~ 基本的MVC配置就不展示了,这里给出核心代码 在spring-mvc的配置文件中写入如下配置 <bean id="multi ...
- HDU 3073 Saving Beans
Saving Beans Time Limit: 3000ms Memory Limit: 32768KB This problem will be judged on HDU. Original I ...