前奏:统计 n! 中的所有质因子中pi的个数

普通方法:复杂度O(nlogn), 当n为10的18次方无法承受

// 复杂度O(nlogn), n为10的18次方无法承受
int cal(int n, int p){
int ans = ;
for (int i = ; i <= n; i++){
int temp = i;
while (temp % p == ){
ans++;
temp /= p; // temp除以p
}
}
return ans;
}

改进后的方法:复杂度只有O(logn)

int cal(int n, int p){
int ans = ;
while (n){
ans += n / p; // 累加 n / p^k
n /= p; // 相当于分母多乘一个 p
}
return ans;
}

1. 组合数的计算(如果只需计算一个组合数则用法三,如果计算很多个组合数则用法二)

法一:通过定义计算

long long C(long long n, long long m){
long long ans = ;
for (long long i = ; i <= n; i++){
ans *= i;
}
for (long long i = ; i <= m; i++){
ans /= i;
}
for (long long i = ; i <= n - m; i++){
ans /= i;
}
return ans;
}

法二:通过递推式计算

int res[][];            // 用于存放组合数的值
// 法二:通过递推式计算
long long C(long long n, long long m){
if (n == || m == n)
return ;
if (res[n][m] != )
return res[n][m];
return res[n][m] = C(n - , m) + C(n - , m - ); // 赋值给res[n][m]并返回
}

把所有组合数都计算出来

// 把所有组合数都计算出来
const int n = ;
void calC(){
for (int i = ; i <= n; i++){
res[i][] = res[i][i] = ; // 初始化边界
}
for (int i = ; i <= n; i++){
for (int j = ; j <= i / ; j++){
res[i][j] = res[i - ][j] + res[i - ][j - ]; // 递推计算C(i, j)
res[i][i - j] = res[i][j]; // C(i, i - j) = C(i, j)
}
}
}

法三:定义变形,复杂度O(m)(推荐)

long long C(long long n, long long m){
long long ans = ;
for (int i = ; i <= m; i++){
ans = ans * (n - m + i) / i; // 注意一定要先乘再除
}
}

2. 计算C(n, m) % p

递归

// 递归
int res[][] = { };
int C(int n, int m, int p){
if (m == || m == n) return ;
if (res[n][m] != )
return res[n][m]; // 已经有值
return res[n][m] = (C(n - , m, p) + C(n - , m - , p)) % p; // 赋值后返回
}

非递归

void CalC(int n, int p){
for (int i = ; i <= n; i++){
res[i][] = res[i][i] = ; // 初始化边界
}
for (int i = ; i <= n; i++){
for (int j = ; j <= i; j++){
res[i][j] = (res[i - ][j] + res[i - ][j - ]) % p;
res[i][i - j] = res[i][j];
}
}
}

组合数的计算以及组合数对p取余后结果的计算的更多相关文章

  1. 用shell脚本 计算两个数的加减乘除取余

    #! /bin/bash # read -p '请输入数:' a //输入 read -p '请输入数:' b echo '$a+$b=' $(( a + b )) //输出 echo '$a-$b= ...

  2. ZZNU-oj-2141:2333--【O(N)求一个数字串能整除3的连续子串的个数,前缀和数组+对3取余组合数找规律】

    2141: 2333 题目描述 “别人总说我瓜,其实我一点也不瓜,大多数时候我都机智的一批“ 宝儿姐考察你一道很简单的题目.给你一个数字串,你能判断有多少个连续子串能整除3吗? 输入 多实例输入,以E ...

  3. CJOJ 2255 【NOIP2016】组合数问题 / Luogu 2822 组合数问题 (递推)

    CJOJ 2255 [NOIP2016]组合数问题 / Luogu 2822 组合数问题 (递推) Description 组合数\[C^m_n\]表示的是从n个物品中选出m个物品的方案数.举个例子, ...

  4. 大数计算_BigNum优化_加减乘除乘方取余_带注释_数组

    #include <iostream> #include <algorithm> #include <cstring> #include <cstdlib&g ...

  5. python的加、减、乘、除、取整、取余计算

    加法: 输入以下代码: >>>1+1 >>>1.0+1 减法: 输入以下代码: >>>1-2 >>>1.0-2 乘法: 输入以下 ...

  6. salesforce 零基础学习(四十三)运算取余

    工作中遇到一个简单的小问题,判断两个数是否整除,如果不整除,获取相关的余数. 习惯java的我毫不犹豫的写下了代码 public Boolean isDivisibility(Integer divi ...

  7. 2014年百度之星程序设计大赛 - 初赛(第一轮) hdu Grids (卡特兰数 大数除法取余 扩展gcd)

    题目链接 分析:打表以后就能发现时卡特兰数, 但是有除法取余. f[i] = f[i-1]*(4*i - 2)/(i+1); 看了一下网上的题解,照着题解写了下面的代码,不过还是不明白,为什么用扩展g ...

  8. 提高java编程质量 - (二)取余用偶判断,不要用奇判断

    取余判断原则:取余用偶判断,不要用奇判断 先看一个 程序: package com.test; import java.util.Scanner; public class t1 { public s ...

  9. 洛谷 P1226 【模板】快速幂||取余运算

    题目链接 https://www.luogu.org/problemnew/show/P1226 题目描述 输入b,p,k的值,求b^p mod k的值.其中b,p,k*k为长整型数. 输入输出格式 ...

随机推荐

  1. 硬件知识整理part2--电阻在反馈网络中的应用

    学而不厌,诲人不倦,不知老之将至.--孔子 电阻作为电路中基本的元器件之一.在电路设计中,我们有时会使用欧姆定律来大致估计一下电阻值的大小,但是大多时候我们是不用去过多考虑电阻值的大小,像我这样大方的 ...

  2. CentOS7安装postgreSQL11

    1.添加PostgreSQL Yum存储库 sudo yum install https://download.postgresql.org/pub/repos/yum/11/redhat/rhel- ...

  3. netty 的事件驱动

    netty 是事件驱动的,这里面有两个含义,一是 netty 接收到 socket 数据后,会产生事件,事件在 pipeline 上传播,二是事件由特定的线程池处理. NioEventLoop 轮询网 ...

  4. linux 多并发 连接限制修改

    1. 修改 ulimit -a 查看 open files 表示单个用户能打开的最大句柄  如果开发的高并发当个进程打开的句柄需要很大. 修改/etc/security/limits.conf 里面有 ...

  5. CodingPlus Blog Update Info

    CodingPlus更新啦! 我就是记录一下!您想知道现在的博客是第几代的吗?您想知道CodingPlus博客的发展历程吗?来,让我们一起看看! V3.5 最新版了! V3.5.0 很多人看到自然觉得 ...

  6. 在VS的依赖项中引用项目

    操作步骤:鼠标右击项目(注意是项目)->添加->引用->项目(在项目列表中选择需要引用的项目)->确定

  7. 网站后门shell-----eval

    我们先来看看网站被攻击的代码: <?php error_reporting(E_ERROR); unlink('user.php'); unlink('../member/login.php') ...

  8. uva1428树状数组

    用树状数组统计每个点i,左边与右边与多少个点小于a[i],然后用乘法原理和加法原理得出答案 #pragma GCC optimize(2) #include <bits/stdc++.h> ...

  9. PTA 简单计算器(C语言)

    模拟简单运算器的工作.假设计算器只能进行加减乘除运算,运算数和结果都是整数,四种运算符的优先级相同,按从左到右的顺序计算. 输入格式:输入在一行中给出一个四则运算算式,没有空格,且至少有一个操作数.遇 ...

  10. Wannafly Winter Camp 2020 Day 5I Practice for KD Tree - 二维线段树

    给定一个 \(n \times n\) 矩阵,先进行 \(m_1 \leq 5e4\) 次区间加,再进行 \(m_2 \leq 5e5\) 次询问,每次询问要求输出矩形区间内的最大数.\(n \leq ...