快速幂、快速乘和组合数

快速幂($m^n$):

 1 ll quickpow(ll m, ll n, ll k)
 2 {
 3     ll res = 1;
 4     while (n > 0)
 5     {
 6         if (n & 1)
 7             res = (res * m) % k;
 8         m = (m * m) % k;
 9         n = n >> 1;
10     }
11     return res;
12 }

快速乘($mn$):

 1 ll quickmul(ll m, ll n, ll k)
 2 {
3 m = (m % k + k) % k; n = (n % k + k) % k;
4 ll res = 0; 5 while (n > 0) 6 { 7 if (n & 1) 8 res = (res + m) % k; 9 m = (m + m) % k; 10 n = n >> 1; 11 } 12 return res; 13 }

全部组合($C_i^j \% P,1\leq i\leq maxn,0\leq j\leq i$)

int C[maxn][maxn];
void comp(int n, int P)
{
    memset(C, 0, sizeof(C));
    for (int i = 0; i <= n; i++)
    {
        C[i][0] = 1;
        for (int j = 1; j <= i; j++)  C[i][j] = (C[i - 1][j - 1] + C[i - 1][j]) % P;
    }
}

部分组合($C_n^0,C_n^1,\cdots,C_n^n$)

void comp(int n)
{
    C[0] = 1;
    for (int i = 1; i <= n; i++)  C[i] = C[i - 1] * (n - i + 1) / i;   //应该先乘后除,因为C[i-1]/i可能不是整数
}

单个组合($C_n^m$)

LL comp(LL n, LL m)
{
    double ans = 1;
    for (int i = 0; i < m; i++)  ans *= n - i;
    for (int i = 0; i < m; i++)  ans /= i + 1;
    return (LL)(ans + 0.5);
}

 

 

 

参考链接:http://www.cnblogs.com/qscqesze/p/5129856.html 

转载于:https://www.cnblogs.com/lfri/p/9317093.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值