转自:文章

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. Google、微软软件测试之道

    扫码时备注或说明中留下邮箱 付款后如未回复请至https://shop135452397.taobao.com/ 联系店主

  2. stm32 开发中startup.s文件中常见的命令功能

    由于C的普及以及编译器的发展,越来越多的软件工程师在编程时很少有机会接触到汇编语言.在ARM的开发中,我们不可避免的会遇到启动文件的编写,在KEIL环境中一般采用了startup.s的文件作为启动代码 ...

  3. mac上为nodejs设置环境变量

    Mac下面的环境变量设置和Linux差不多,一般为这几个文件(左边的先加载): /etc/profile /etc/paths ~/.bash_profile ~/.bash_login ~/.pro ...

  4. c#引用命名空间的作用

    System 包含用于定义常用值和引用数据类型.事件和事件处理程序.接口.属性和处理异常的基础类和基类.其他类提供支持下列操作的服务:数据类型转换,方法参数操作,数学计算,远程和本地程序调用,应用程序 ...

  5. how2j学习日志——J2EE(2018年3月28日)

    1. 开始跟着站长学习J2EE,首页是简单的Tomcat安装和部署,我从官网上下载的是7.0.85版本,修改server.xml中的默认端口号为80.80端口是web服务的默认端口,因此在浏览器上输入 ...

  6. how2j网站前端项目——天猫前端(第一次)学习笔记1

    首先是公共页面的学习,有页头.页脚和搜索框. 一.页头就是天猫网站的置顶导航栏: 看似简单,实际做起来也不容易. 写html还是比较简单的,撸起袖子就可以写完.可要想做到上图的样式就难了,难就难在CS ...

  7. 关于vue的npm run dev和npm run build

    ├─build │ ├─build.js │ ├─check-versions.js │ ├─dev-client.js │ ├─dev-server.js │ ├─utils.js │ ├─vue- ...

  8. Failed to read artifact descriptor for xxx:jar的问题解决

    在开发的过程中,尤其是新手,我们经常遇到Maven下载依赖jar包的问题,也就是遇到“Failed to read artifact descriptor for xxx:jar”的错误. 对于这种非 ...

  9. Linux_(2)基本命令(下)

    六.文件搜索命令11 :which功能描述:显示系统命令所在目录命令所在路径:/usr/bin/which执行权限:所有用户语法:which [命令名称]范例:$ which ls 12 :find功 ...

  10. Activity(活动)