转自:文章

1、暴力求解

C(n,m)=n*(n-1)*...*(n-m+1)/m!,(n<=15);

int CF(int n,int m)
{
int ans=,i,j;
for(i=n;i>=n-m+;i--)
ans*=i;
for(i=m;i>=;i--)
ans/=i;
return ans;
}

2、打表

C(n,m)=C(n-1,m-1)+C(n-1,m),(n<=10000);

const int maxn = ;
const int MOD = ;
void CF(int n,int m)
{
int i,j;
for(i=;i<=maxn;i++)
{
c[][i]=;c[i][]=;
}
for(i=;i<=maxn;i++)
for(j=;j<=maxn;j++)
c[i][j]=(c[i-][j]+c[i-][j-])%MOD;
}

3、质因数分解

C(n,m)=n!/(m!*(n-m)!),C(n,m)=p1a1-b1-c1p2a2-b2-c2…pkak-bk-ck,(n<=10000000)

#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
const int MOD = ;
const int maxn = ;
bool a[maxn]={false};
vector <int> prim_produce() //生成素数序列
{
vector <int> vc;
vc.push_back();
int i,j;
for(i=;i*i<=maxn;i+=)
{
if(!a[i])
{
vc.push_back(i);
for(j=i*i;j<=maxn;j+=i)
{
a[j]=true;
}
}
}
while(i<maxn)
{
if(!a[i]) vc.push_back(i);
i+=;
}
return vc;
}
//计算n!素数p的指数
int cal(int x,int p)
{
int ans=;
long long re=p;
while(x>=re)
{
ans+=x/re;
re*=p;
}
return ans;
} int Pow(long long n,int k) //二分求n的k次方
{
long long ans=;
while(k)
{
if(k&) ans=ans*n%MOD;
n=(n*n)%MOD;
k>>=;
}
return ans;
}
int comb(int n,int m) //计算公式
{
vector <int> prim=prim_produce();
long long ans=;
int num;
for(int i=;i<prim.size()&&prim[i]<=n;i++)
{
num=cal(n,prim[i])-cal(m,prim[i])-cal(n-m,prim[i]);
ans=(ans*Pow(prim[i],num))%MOD;
}
return ans;
}
int main(void)
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
printf("%d\n",comb(n,m));
}
return ;
}

4、Lucas定理

将m,n化为p进制,有:C(n,m)=C(n0,m0)*C(n1,m1)...(mod p),算一个不是很大的C(n,m)%p,p为素数,化为线性同余方程,用扩展的欧几里德定理求解,n在int范围内,修改一下可以满足long long范围内。

#include <stdio.h>
const int M = ;
int ff[M+]; //打表,记录n!,避免重复计算 //求最大公因数
int gcd(int a,int b)
{
if(b==)
return a;
else
return gcd(b,a%b);
} //解线性同余方程,扩展欧几里德定理
int x,y;
void Extended_gcd(int a,int b)
{
if(b==)
{
x=;
y=;
}
else
{
Extended_gcd(b,a%b);
long t=x;
x=y;
y=t-(a/b)*y;
}
} //计算不大的C(n,m)
int C(int a,int b)
{
if(b>a)
return ;
b=(ff[a-b]*ff[b])%M;
a=ff[a];
int c=gcd(a,b);
a/=c;
b/=c;
Extended_gcd(b,M);
x=(x+M)%M;
x=(x*a)%M;
return x;
} //Lucas定理
int Combination(int n, int m)
{
int ans=;
int a,b;
while(m||n)
{
a=n%M;
b=m%M;
n/=M;
m/=M;
ans=(ans*C(a,b))%M;
}
return ans;
} int main()
{
int i,m,n;
ff[]=;
for(i=; i<=M; i++) //预计算n!
ff[i]=(ff[i-]*i)%M;
while(~scanf("%d%d",&n, &m))
{
printf("%d\n",Combination(n,m));
}
return ;
}

组合数C(n,m)的四种求解方法的更多相关文章

  1. C#四种深拷贝方法

    //四种深拷贝方法 public static T DeepCopyByReflect<T>(T obj) { //如果是字符串或值类型则直接返回 if (obj is string || ...

  2. C语言中返回字符串函数的四种实现方法 2015-05-17 15:00 23人阅读 评论(0) 收藏

    C语言中返回字符串函数的四种实现方法 分类: UNIX/LINUX C/C++ 2010-12-29 02:54 11954人阅读 评论(1) 收藏 举报 语言func存储 有四种方式: 1.使用堆空 ...

  3. CSS当中color的四种表示方法

    这是我的第一篇博客,所以写的东西会比较简单. css当中,好多地方都会用到color属性,用来使html内容丰富多彩,例如:background-color:border-color: 第一种表示法使 ...

  4. C语言中返回字符串函数的四种实现方法

    转自C语言中返回字符串函数的四种实现方法 其实就是要返回一个有效的指针,尾部变量退出后就无效了. 有四种方式: 1.使用堆空间,返回申请的堆地址,注意释放 2.函数参数传递指针,返回该指针 3.返回函 ...

  5. sass学习笔记 -- sass的四种编译方法

    sass的四种编译方法:(.scss) (一)ruby下的命令行编译 首先需要安装ruby,注意需勾选Add Ruby executables to your PATH选项,以添加环境变量. ruby ...

  6. Django的POST请求时因为开启防止csrf,报403错误,及四种解决方法

    Django默认开启防止csrf(跨站点请求伪造)攻击,在post请求时,没有上传 csrf字段,导致校验失败,报403错误 解决方法1: 注释掉此段代码,即可. 缺点:导致Django项目完全无法防 ...

  7. HashMap的四种遍历方法,及效率比较(简单明了)

    https://yq.aliyun.com/ziliao/210955 public static void main(String[] args) { HashMap<Integer, Str ...

  8. 百度地图和高德地图坐标系的互相转换 四种Sandcastle方法生成c#.net帮助类帮助文档 文档API生成神器SandCastle使用心得 ASP.NET Core

    百度地图和高德地图坐标系的互相转换   GPS.谷歌.百度.高德坐标相互转换 一.在进行地图开发过程中,我们一般能接触到以下三种类型的地图坐标系: 1.WGS-84原始坐标系,一般用国际GPS纪录仪记 ...

  9. AJPFX关于Java中运用数组的四种排序方法

    JAVA中在运用数组进行排序功能时,一般有四种方法:快速排序法.冒泡法.选择排序法.插入排序法.快速排序法主要是运用了Arrays中的一个方法Arrays.sort()实现.冒泡法是运用遍历数组进行比 ...

随机推荐

  1. 【mybatis基础】mybatis开发dao两种方法

    mybatis是一个支持普通SQL查询,存储过程和高级映射的优秀的持久层的框架,是apache下的顶级项目.mybatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.mybat ...

  2. 什么是PCM?它和.wav文件是什么关系?

    PCM(Pulse Code Modulation----脉码调制录音).所谓PCM录音就是将声音等模拟信号变成符号化的脉冲列,再予以记录.PCM信号是由[1].[0]等符号构成的数字信号,而未经过任 ...

  3. UFPS入门: Unity FPS 教程

    http://blog.csdn.net/kmyhy/article/details/72846348 UFPS : Ultimate FPS v1.7.3 download:https://item ...

  4. reportviewer需要的3个引用

    安装ReportViewer后其中会出现以下DLL.           Microsoft.ReportViewer.ProcessingObjectModel.dll           Micr ...

  5. Python: PySide(PyQt)QMessageBox按钮显示中文

    习惯了Delphi.c#调用系统MessageBox本地化显示,待用PySide调用时,Qt原生提示对话框,默认以英文显示. 如何本地化呢? 参考些资料,加以摸索,实现所需效果.并可根据此思路,设计自 ...

  6. hadoop fs 命令使用

    参考:https://segmentfault.com/a/1190000002672666 命令基本格式: hadoop fs -cmd < args > 1.ls hadoop fs ...

  7. 10-okHttp的同步与异步

    我的理解如下: 同步: 实时的在等待返回结果: 异步:可以不是同步执行的,放入到执行队列中. 所以建议:如果需要根绝请求的结构做些判断应当用 同步,异步可能由于时间先后出现问题. /*post异步请求 ...

  8. utils.js和vue-loader.conf.js

    var utils = require('./utils')var config = require('../config')var isProduction = process.env.NODE_E ...

  9. Oracle_PL/SQL(6) 触发器(序列、视图)

    序列1.创建序列create sequence seq_alog start with 1 increment by 1 maxvalue 999999999999999999999999999 mi ...

  10. istio promethus收集不到数据

    1.重新apply istio.yaml kubectl apply -f install/kubernetes/istio.yaml kubectl get metrics.config.istio ...