首页 > 代码库 > ACM 数学

ACM 数学

欧几里得辗转相除法求最大公约数
int gcd(int a,int b)
{
if(b==0) return a;
else return gcd(b,a%b);
}
求组合数
int C(int n ,int m)
{
    int i,a,fz=1,fm=1;
    for( i = 1; i <= m ;i++)
    {
        fz*=(n-i+1);
        fm*=i; 
        a = gcd(fz,fm); 
        fz/=a;
        fm/=a;
    }
    return fz/fm;
}
错排公式
D(n) = (n-1) [D(n-2) + D(n-1)]
排公式的原形为D(n) = n! (1/0! - 1/1! + 1/2! - 1/3! - ..... + (-1)^n/n!),当n很大时计算就很不方便。一个供参考的简化后的公式是D(n) = [n!/e+0.5] ,其中e是自然对数的底,[x]为x的整数部分。
逆元
对于正整数a和m如果有 ax = 1%m
快速幂算法
#include<stdio.h>
#define M 1000000007
int fp(int a,int b,int c)
{
    long long ret=1,pow=a;//ret:返回值;pow:基底
    while(b!=0)
    {
    if(b&1) 
        ret=(ret*pow)%c; 
    pow=(pow*pow)%c;
    b/=2;//相当于b>>1
    }
return (int)ret;
}
求精准阶乘(数据大可以分段求)

 

ACM 数学