ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

[AcWing 887] 求组合数 III

2022-05-14 16:01:06  阅读:170  来源: 互联网

标签:10 887 log int res 复杂度 cdots III AcWing


image

复杂度 $ g(n) \ log(n) $ (来自 OI WiKi)

总体复杂度 $ 20 \times 10^{5} \times log(10^{5}) \times log(10^{18}) = 4 \times 10^{7} $


点击查看代码
#include<iostream>

using namespace std;
typedef long long LL;
int p;

int qmi(int a, int k)
{
    int res = 1;
    while (k) {
        if (k & 1)  res = (LL) res * a % p;
        k >>= 1;
        a = (LL) a * a % p;
    }
    return res;
}
int C(int a, int b)
{
    if (a < b)  return 0;
    int res = 1;
    for (int i = 1, j = a; i <= b; i ++, j --) {
        res = (LL) res * j % p;
        res = (LL) res * qmi(i, p - 2) % p;
    }
    return res;
}
int lucas(LL a, LL b)
{
    if (b == 0)     return 1;
    return (LL) C(a % p, b % p) * lucas(a / p, b / p) % p;
}
int main()
{
    int n;
    cin >> n;
    while (n --) {
        LL a, b;
        cin >> a >> b >> p;
        cout << lucas(a, b) << endl;
    }
    return 0;
}

  1. 复杂度分析
    复杂度为 $ f(p) + g(n) \ log(n) $ ,其中,$ f(p) $ 为预处理组合数的复杂度, $ g(n) $ 为单次求组合数的复杂度,对应于本题中, 没有对组合数进行预处理,没有 $ f(p) $ 这一项,$ g(n) $ 是单次求组合数的复杂度,由于只有当 $ a < p $ $ , \ b < p $ 时,才会执行求组合数的函数,单次求组合数的复杂度为 $ 10^{5} \times log{10^{5}} $ ,$ log(n) $ 中的 $ n $ 是所要求的 $ C_m^{n} $ 中的 $ n $
  2. 卢卡斯定理
    $ C_a^{b} = C_{ a / p }^{ b / p } \cdot C_{a \bmod p}^{b \bmod p} \ ( \bmod p) $ ,证明如下:
    $ (1 + x)^{ p } = C_p^{0} x^{0} + C_p^{1} x^{1} + \cdots + C_p^{p} x^{p} \equiv 1 + x^{p} \ (\bmod p) $ ,$ a = a_0 p^{0} + a_1 p^{1} + \cdots + a_k p^{k} $ ,$ b = b_0 p^{0} + b_1 p^{1} + \cdots + b_k p^{k} $ ,$ (1 + x) ^ {a} = (1 + x) ^ { a_0 p^{0} + a_1 p^{1} + \cdots + a_k p^{k} } \equiv (1 + x) ^ {a_0} \ (1 + x ^ {p} ) ^ {a_1} \ \cdots \ (1 + x^{p_k} )^{a_k} $ ,两边同时求 $ x^{b} $ 的系数,可以得到 $ C_a^{b} \equiv C_{a_0}^{b_0} \ C_{a_1}^{b_1} \ \cdots \ C_{a_k}^{b_k} \ (\bmod p) $ ,这个式子和卢卡斯定理的式子是等价的;

标签:10,887,log,int,res,复杂度,cdots,III,AcWing
来源: https://www.cnblogs.com/wKingYu/p/16270345.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有