转自:文章

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. JS中取得<asp:TextBox中的值

    var s = document.getElementById("<%=txt_DaShen.ClientID %>").value; 注:txt_DaShen 为as ...

  2. string类的一些函数方法

    1.请查看String.equals()方法的实现代码,注意学习其实现方法: (1)源程序: public class StringEquals { /** * @param args the com ...

  3. java遍历当前会话所有Session

    //方法一:通过遍历的方法进行遍历 String FileName=""; HttpSession session=request.getSession();//获取session ...

  4. redis.conf配置详解(转)

    # redis 配置文件示例 # 当你需要为某个配置项指定内存大小的时候,必须要带上单位,# 通常的格式就是 1k 5gb 4m 等酱紫:## 1k => 1000 bytes# 1kb =&g ...

  5. 41-ssm中对象查找正确但是没有将数据库中某个属性值赋给对象的一个成员变量

    原因: 变量名虽然与 数据库字段一致,但是 包含下划线,如: a_b,数据库确实也是a_b: 但是ssm开启驼峰命名了,就要将变量名改为   aB , 驼峰命名就可以了.

  6. Python中新式类 经典类的区别(即类是否继承object)

    首先什么是新式类 经典类呢: #新式类是指继承object的类 class A(obect): ........... #经典类是指没有继承object的类 class A: ........... ...

  7. Aspose.Words五 MergeField

    通过MegerField来循环,将数据保存到dataset的table中,dataset通过关联datarelation字段来指定主从表关系.模板中通过标签TableStart和TableEnd来框定 ...

  8. jquery字符串相等判断

    在jquery中字符串相等判断一直失败 原来是空格! string1, string2 若其中有一个为返回值或类似 $.trim(string1) == $.trim(string2) ------- ...

  9. EF语句拦截器-匹配当前的Controller,Action,User

    示例代码,ps:一切都能实现,关键是你尝试的方向,别把简单问题复杂化导致进入死胡同出不来. using Mobile360.Core.Interfaces; using Mobile360.Core. ...

  10. 在windows7中配置ant环境变量

    假设本地以及安装好JDK并且配置好环境变量. 新建/修改系统环境变量 ANT_HOME   D:\develop\apache-ant-1.10.3 PATH       %ANT_HOME%\bin ...