ghostcai

不知道起什么标题了

组合数的计算

更新:不行,精度损失太大!

#include<iostream>
#include<ctime>
#define LL long long
#define MAXN 2000
using namespace std;

int cnt;
int f[MAXN][MAXN];



LL c(LL m,LL n){
    cnt++;
    return n==1?m:1.0*m/n*c(m-1,n-1);
}

//
//LL c(LL m,LL n){
//  if(m==0) return 0;
//  if(n==1) return m;
//  cnt++;
//  return c(m-1,n)+c(m-1,n-1);
//  
//}

//LL c(LL m,LL n){
//  if(f[m][n]) return f[m][n];
//  if(m==0) return 0;
//  if(n==1) return m;
//  cnt++;
//  return f[m][n]=c(m-1,n)+c(m-1,n-1);
//  
//}

int main(){
    cout<<c(100,10);
    cout<<endl<<cnt<<endl;
    cout<<(double)clock()/CLOCKS_PER_SEC;
    return 0;

}


王老师证明费马小定理的副产物,C(m,n)=m/n*C(m-1,n-1);
想到能不能用这个算组合数,应该只有O(n)的复杂度。
试了一下,确实快得不像话,对比一下 (阶乘就..免了吧)
第二个用C(m,n)=C(m-1,n)+C(m-1,n-1)
第三个记忆化

不是很确定正确不正确。。。

分类:

技术点:

相关文章:

  • 2021-10-12
  • 2022-12-23
  • 2021-08-03
  • 2021-07-19
  • 2022-12-23
  • 2021-10-22
  • 2021-08-23
  • 2022-01-04
猜你喜欢
  • 2021-11-30
  • 2021-11-16
  • 2021-05-15
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-06-04
相关资源
相似解决方案