大组合数模100W以内任意整数

动态规划之【背包DP】第10课:完全背包DP应用案例实践4 阅读详情

那么要求模数为质数的lucas定理就不能用了

我们只能直接算阶乘了

但是对组合数分母来说与模数不互质的话逆元是不存在的

记当前问题为C(n,k) % m

把m分解质因数后得到的m=p1^r1 * p2^r2 *......

C(n,k) % p1^r1

C(n,k) % p2^r2

......

之后把所有结果用中国剩余定理合并就得到原来的结果了

那么现在的问题就是怎么求 C(n,k) % p^r

首先还是要解决互质的问题我们才能算分母的逆元

我们计算出 n! k! (n-k)!分别含有多少个p因子,就可以算出该组合数总的p因子数,如果大于等于r说明是p^r的倍数,取模得0,如果不是那还要往下算

算一个阶乘含多少个p因子的方法是:n/p+n/p/p+n/p/p/p+......

然后就是要算剩下的与p互质的部分了,也就是要算一个不含p因子的阶乘

记mod=p^r

我们可以先预处理出到mod的阶乘,遇到p的倍数先暂时忽略,乘1就可以了,其他的照常乘进去

然后对于n!来说,每mod个数的乘积对mod取模是相等的,就是说 1*2*...*mod == (mod+1)*(mod+2)*(2mod)

当然我说的都是除去含p因子的数之后的,为了方便描述我就先直接这么说了

那么就可以看n能被mod分成多少份,就得到n!=(mod!)^(n/mod) * (n%mod)! * (含p因子的数除去p因子后剩下的东西)

现在问题又缩小到怎么求含p因子的数除去p因子后剩下的东西了

因为 p 除去p剩下1 ,2p除去p剩下2 ,。。。。。。

因为剩下的东西要乘起来,所以就相当于能被p分成多少份,就是它的阶乘,即(n/p)!

这个东西也是要除去含p的因子的,也就是那些p的高次方的数除去一个p后还会剩下一些p

那么就跟我们上面的过程类似,可以n/=p循环求解,把所有结果乘一起

现在得到了不含p因子的阶乘了,那么分母就可以通过欧拉定理求逆了

把分子和分母的逆和一开始求出来的该组合数总的p因子数全部乘一起就得到一条方程的结果了

好了之后剩下的就是中国剩余定理合并所有方程的结果了。


代码:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<string>
#include<iomanip>
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<vector>
#include<set>
#include<map>
#include<queue>
#include<list>

using namespace std;
typedef long long LL;
typedef unsigned long long ULL;

#define rep(i,k,n) for(int i=(k);i<=(n);i++)
#define red(i,k,n) for(int i=(k);i>=(n);i--)
#define sqr(x) ((x)*(x))
#define clr(x,y) memset((x),(y),sizeof(x))
#define MAX(a,b) ((a)>(b)?(a):(b))
#define MIN(a,b) ((a)>(b)?(b):(a))

LL n,k,m;
LL p[25],r[25];
int pcnt;

LL a[25];

LL quipow(LL x,LL k,LL mod)
{
    LL ret=1;
    while(k)
    {
        if(k&1)ret=ret*x%mod;
        x=x*x%mod;
        k>>=1;
    }
    return ret;
}

int quipow(int x,int k)
{
    int ret=1;
    while(k)
    {
        if(k&1)ret=ret*x;
        x=x*x;
        k>>=1;
    }
    return ret;
}

void getprime(int m)
{
    clr(p,0);
    clr(r,0);
    pcnt=0;
    for(LL i=2;i*i<=m;i++)
    {
        if(m%i==0)
        {
            p[++pcnt]=i;
            while(m%i==0){m/=i;r[pcnt]++;}
        }
    }
    if(m>1)
    {
        p[++pcnt]=m;
        r[pcnt]=1;
    }
}

LL f[1000010];

void pref(int p,int mod)
{
    clr(f,0);
    f[0]=f[1]=1;
    rep(i,2,mod-1)f[i]=f[i-1]*(i%p?i:1)%mod;
}

LL getp(LL n,LL p)
{
    LL ret=0;
    while(n) ret+=(n/=p);
    return ret;
}

LL getf(LL n,LL mod,LL p)
{
    LL ret=1;
    while(n)
    {
        ret=ret*quipow(f[mod-1],n/mod,mod) %mod *f[n%mod] %mod ;
        n/=p;
    }
    return ret;
}

LL getc(LL n,LL m,LL p,LL r)
{
    LL mod=quipow(p,r);
    pref(p,mod);
    LL nump=getp(n,p)-getp(m,p)-getp(n-m,p);
    if(nump>=r)return 0;
    return quipow(p,nump,mod)*getf(n,mod,p)%mod *quipow(getf(m,mod,p)*getf(n-m,mod,p)%mod,(p-1)*quipow(p,r-1)-1,mod)%mod ;
}

LL exgcd(LL a,LL b,LL &x,LL &y)
{
    if(!b)
    {
        x=1;
        y=0;
        return a;
    }
    else
    {
        LL g=exgcd(b,a%b,y,x);
        y-=x*(a/b);
        return g;
    }
}

int CR(int cnt)
{
    LL ret=0,x,y;
    rep(i,1,cnt)
    {
        exgcd(m/p[i],p[i],x,y);
        ret=(ret+m/p[i]*x*a[i])%m;
    }
    return (ret+m)%m;
}

int main()
{
//#define LOCAL
#ifdef LOCAL
	freopen("e:\\read.txt","r",stdin);
	//freopen("e:\\write.txt","w",stdout);
#endif
    while(cin>>n>>k>>m)
    {
        getprime(m);
        rep(i,1,pcnt)
        {
            a[i]=getc(n,k,p[i],r[i]);
            p[i]=quipow(p[i],r[i]);
        }
        cout<<CR(pcnt)<<endl;
    }


	return 0;
}


华为昇腾 910B 实战:DeepSeek-R1 蒸馏模型高效部署与性能调优全解析 本文详细解析了在华为昇腾910B硬件平台上高效部署DeepSeek-R1蒸馏系列模型(14B/32B版本)的完整实战流程。内容涵盖从MindIE环境搭建、镜像获取、模型准备,到服务配置、内存参数调优、性能测试及常见问题排查,为开发者提供了基于昇腾910B进行大模型部署与优化的全链路指南。 阅读详情

相关推荐

PAM4信号测试实战:从眼图分析到误码率测量的技术演进

在高速数字系统设计中,信号完整性测试是确保数据传输可靠性的核心环节。其基本原理在于通过时域和频域分析,精确评估信号在传输过程中的质量衰减与失真。随着数据速率向56Gbps及以上演进,传统的NRZ编码面临带宽瓶颈,而PAM4调制技术通过在每个符号周期内承载更多比特信息,成为提升信道效率的关键路径。这项技术的工程价值在于,它允许在相同带宽下实现翻倍的数据吞吐量,这对于数据中心互联、PCIe 6.0及800G以太网等高速接口至关重要。然而,PAM4信号电平间距更小,对噪声和抖动极为敏感,导致其原始误码率显著升高,

weixin_42522817的博客 657

组合数取模之逆元方法+模板

参自: http://www.cnblogs.com/liziran/p/6804803.html https://baike.baidu.com/item/%E8%B4%B9%E9%A9%AC%E5%B0%8F%E5%AE%9A%E7%90%86/4776158?fr=aladdin 现在目标是求Cnm%p,p为素数(经典p=1e9+7) 虽然有Cnm=n

xiaoli_nu的博客 2695

Simulink中为Scope模块添加图例的方法

比如我要在Scope模块输出三轴加速度的数据,但三轴数据波形混杂在一起不太好看,此时就需要在Scope模块中添加图例来使波形看起来更加清晰明了。 注:我这里使用的Matlab版本为2019a 1.首先在simulink中打开,需要添加图例的Scope,如图示: 2.在Matlab,command窗口输入: >> set(0,'ShowHiddenHandles','On'); >> set(gcf,'menubar','figure'); 此时你会发现Scope窗口菜单栏多了好几

Kunfly的博客 1万+

组合数模任意数

本文内容是求组合数模合数的方法 本方法有局限性,假设求CKN mod PC_N^K \ mod \ P 其中P=Πmi=1Pqii,其中P = \Pi_{i=1}^{m}P_i^{q_i},对于任意i,j∈[1,m],(Pi,Pj)=1对于任意i,j\in[1,m],(P_i, P_j) = 1 若要使用本方法,则PqiiP_i^{q_i}不能太大 具体方法如下具体方法如下 我们知道,一般

geng4512的专栏 1903

Xilinx FPGA平台DDR3设计保姆式教程(3)MIG IP核使用教程及DDR读写时序

干货来了,用DDR搬砖,只需要会用IP就好,Xilinx官方YYDS! ----------------------------------------------------------------------------------------------------------------- 汇总篇: Xilinx平台DDR3设计保姆式教程(汇总篇)——看这一篇就够了 ----------------------------------------------------------...

数字IC/FPGA杂货铺,找一找,或许有你想要的~ 2万+

基于深度学习的CT图像肺结节分割与检测系统[完整代码数据分享]

基于深度学习的CT图像肺结节分割与检测系统[完整代码数据分享]

269

Lucas定理推广(组合数取模)

Lucas定理推广(组合数取模) 2011年4月21日Earthson3 条评论 比赛的时候,意外想到了个方法来处理组合数取模。一推,发现就是Lucas定理,并且,在模数是素数乘方的情况作了些推广。使得lucas能够处理模任意数的组合数取模。 Lucas定理 首先给出Lucas定理的递归描述 简要证明思路: 考虑连续的p...

guanhuaing 609

第110章 PCL PointCloudFusing 点云融合重建详细讲解

点云融合是指将多个不同视角、不同位置、不同传感器获取的点云数据进行合并,得到一个更加完整、准确的三维模型。多视角扫描:从多个相机或传感器获取点云数据,需要将这些数据融合成一个统一的三维模型。传感器融合:例如将激光雷达(LiDAR)点云与相机的图像数据融合,以便获得更高质量的三维重建。动态场景重建:动态环境中的物体,点云数据不断更新,如何平滑地融合这些点云是一个重要课题。点云融合的目标是将不同来源的点云数据准确地合并,消除冗余,减少噪声,并提高整体的点云密度和精度。

yumeiguo的博客 503

组合数快速算法[转]

计算组合数最大的困难在于数据的溢出,对于大于150的整数n求阶乘很容易超出double类型的范围,那么当C(n,m)中的n=200时,直接用组合公式计算基本就无望了。另外一个难点就是效率。 对于第一个数据溢出的问题,可以这样解决。因为组合数公式为:C(n,m) = n!/(m!(n-m)!) 为了避免直接计算n的阶乘,对公式两边取对数,于是得到:ln(C(n,m)) = ln(n!)-ln(m!)...

weixin_34320159的博客 1235

什么是 AI Agent?它和直接调用大模型 API 有什么区别?

什么是 AI Agent?它和直接调用大模型 API 有什么区别?

我哎GIS博客 6486

【K8S系列】Kubernetes 中 Pod 无法通过 Service 名称访问服务的 DNS 解析失败问题【已解决】

在 Kubernetes 中,Service 提供了一种稳定的方式,通过名称访问一组 Pod。当其他 Pod 无法通过 Service 名称访问服务,并且出现 DNS 解析失败时,通常会导致应用无法正常工作。本文将详细分析此问题的常见原因及其解决方案。

颜淡慕潇 1万+

组合数求法汇总

另外,Lucas 定理也有适用范围,它一般适用于模数并不是很大(一般是小质数,范围在。的范围不是很大的情况,而限制没有,即方便写高精度,也可以对任意模数取模,唯一缺点便是时间复杂度为。,在取模的意义下,除一个数等于乘它的逆元,我们就可以线性求出阶乘逆元,然后。我们上文说了逆元求组合数需要模上一个质数,那么在模数任意的情况下如何求解?(斯特林数,如果不知道的话很难推出来,可以学一学)的方案,根据加法原理,令它们相加就得到了。(梦回高中数学,需要推出式子,然后高精度求)非常大,模数非常小,的情况。

summ1ts的博客 2716

基于STM32的智能浇花系统毕业设计(全部资料)

摘要:本文设计了一种基于STM32单片机的智能浇花系统,集成了环境温湿度检测、土壤温湿度监测、LCD显示、Wi-Fi联网及手机APP远程控制等功能。系统通过传感器实时采集环境参数,自动控制水泵工作实现智能灌溉,同时支持用户通过手机APP远程监控和调节。论文详细阐述了硬件选型、软件设计及系统测试过程,验证了系统的稳定性和实用性。该设计为家庭园艺提供了智能化解决方案,具有节水高效、操作便捷等特点。关键词:STM32;智能灌溉;远程控制;环境监测;Wi-Fi通信。

3254968421的博客 1196

[来源未知]组合数取模

组合数取模 【问题描述】 给定n,m,p,求C(n,m) mod p。 【输入说明】 第一行三个整数n,m,p。 【输出格式】 输出一个整数,表示C(n,m) mod p。 【样例输入】 5 2 3 【样例输出】 1 【数据规模及约定】 对于100%的数据,1≤m≤n≤10^6,1≤p≤10^5。 sol: 发现p很小,对p质因数分解,为p1^c1,p2^c2…...

Gzb1128的栖息地 333

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

数论11——大组合数

记得前几章的组合数吧 我们学了O(n^2)的做法,加上逆元,我们又会了O(n)的做法 现在来了新问题,如果n和m很大呢, 比如求C(n, m) % p ,n<=1e18,m<=1e18,p<=1e5 看到没有,n和m这么大,但是p却很小,我们要利用这个p (数论就是这么无聊的东西,我要是让n=1e100,m=1e100,p=1e100你有本事给我算啊(°□...

weixin_34365635的博客 103

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

组合数计算(Lucas 逆元 中国剩余定理)

Problem 1. treasure Input file: treasure.in Output file: treasure.out Time limit: 1 second Memory limit: 256 MB 最近Mr. H 得到了一个宝箱, 但宝箱被上了锁, 需要解决一个问题才能将其打开, 问题是这样的: 你有n 个不同的苹果, 你想从里面选出m 个来, 问方案数, 结果

w4149 573

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

[bzoj2142]礼物 扩展lucas定理

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

LvYanchang的博客 868

【BZOJ2142】礼物 组合数+CRT

【BZOJ2142】礼物 Description 小E从商店中购买了n件礼物,打算送给m个人,其中送给第i个人礼物数量为wi。请你帮忙计算出送礼物的方案数(两个方案被认为是不同的,当且仅当存在某个人在这两种方案中收到的礼物不同)。由于方案数可能会很大,你只需要输出模P后的结果。 Input 输入的第一行包含一个正整数P,表示模; 第二行包含两个整整数n和m,分别表示...

aodanchui1057的博客 209

hihocoder 1191 小W与网格 (组合数)

hihocoder 1191 小W与网格 (组合数)

Tc的专栏 1215

UOJ #275: 组合数问题 题解

非常好的题目,感觉这个lucas的应用算是常见套路了吧 题目要求CMN≡0(modk)CNM≡0(modk)C_N^M\equiv0(modk),因为k是质数,所以根据Lucas定理,CM/kN/k∗CMmodkNmodk≡0(modk)CN/kM/k∗CNmodkMmodk≡0(modk)C_{N/k}^{M/k}*C_{Nmodk}^{Mmodk}\equiv 0(modk) 我们发现这个...

IcePrincess_1968's World 769

洛谷—— P1869 愚蠢的组合数

https://www.luogu.org/problemnew/show/1869 题目描述 最近老师教了狗狗怎么算组合数,狗狗又想到了一个问题。。。 狗狗定义C(N,K)表示从N个元素中不重复地选取K个元素的方案数。 狗狗想知道的是C(N,K)的奇偶性。 当然,这个整天都老是用竖式算123456789*987654321=?的人不会让你那么让自己那么轻松,它说:“N和K都可...

agcozdwdfvds08078的博客 356

组合数

comb.c/cpp/pas 1s/128M 【题目描述】 最近老师教了小明怎么算组合数,小明又想到了一个问题。。。 小明定义C(N,K)表示从N个元素中不重复地选取K个元素的方案数。 小明想知道的是C(N,K)的奇偶性。 当然,这个整天都老是用竖式算123456789*987654321=?的人不会让你那么让自己那么轻松,它说:“N和K都可能相当大。” 但是小明也犯难了,所以

Abraham_Es_Chen的博客 615

Contest 20140708 testB dp 组合数

testB 输入文件: testB.in 输出文件testB.out 时限3000ms 问题描述: 定义这样一个序列(a1,b1),(a2,b2),…,(ak,bk)如果这个序列是方序列的话必须满足下面两个条件: (1)1<=a1<=b1<a2<=b2<….<ak<=bk<=n 。其中n是给定的正整数。 (2)b1-...

alex151194310的博客 122

ACM数论之旅10---大组合数-卢卡斯定理(在下卢卡斯,你是我的Master吗?(。-`ω´-) )...

记得前几章的组合数吧 我们学了O(n^2)的做法,加上逆元,我们又会了O(n)的做法 现在来了新问题,如果n和m很大呢, 比如求C(n, m) % p ,n<=1e18,m<=1e18,p<=1e5 看到没有,n和m这么大,但是p却很小,我们要利用这个p (数论就是这么无聊的东西,我要是让n=1e100,m=1e100,p=1e100你有本事给我算啊...

weixin_30502157的博客 183

【2020.10.29 洛谷团队赛 普及组】T3 U138032 组合数

题目描述 输入格式 第一行有两个整数t,k,t,k,t,k,其中t表示该测试点总共有多少组测试数据,k的意义见「题目描述」。 接下来t行每行两个整数n,mn,mn,m,其中n,mn,mn,m的意义见「题目描述」。 输出格式 输出共t行,每行一个整数代表对于所有的 0≤i≤n,0≤j≤min(i,m)0 ≤ i ≤ n, 0 ≤ j ≤ min(i,m)0≤i≤n,0≤j≤min(i,m)有多少对 (i,j)(i, j)(i,j) 满足 C(i,j)C(i,j)C(i,j)是k 的倍数。 输入输出样例

在人间贩卖声音 268

【NOIP2017提高A组模拟9.17】组合数问题

第二类斯特林数,没有想到边推边模

LZX_lzx的博客 254
上一篇: hdu5389 Zero Escape
下一篇: 处理区间问题之树状数组与莫队算法
窝嘞割草
博客等级 码龄12年 10粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值