前奏:统计 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. rxjs简单的Observable用例

    import React from 'react'; import { Observable } from 'rxjs'; const FlowPage = () => { const onSu ...

  2. C语言实现读取字符转换为浮点数,不使用scanf函数

    c语言读取int或者float数据,我们习惯于使用scanf函数,但是如果不使用scanf函数,该怎么实现呢. 这里就来尝试一下,不使用scanf来读取数据并转换为float类型. 下面的getflo ...

  3. HTML5文档类型如何定义,有哪些标签,以及如何使用,从整体认识HTML5

    html5新增结构标签 header 头部 nav 导航 section 区域 article 文章 aside 侧边栏 figure 一组多媒体内容 figcaption 多媒体内容的标题 foot ...

  4. Maven国内镜像配置(阿里云)-sunziren

    <?xml version="1.0" encoding="UTF-8"?> <settings xmlns="http://mav ...

  5. AI数据标注行业面临的5大发展困局丨曼孚科技

    根据艾瑞咨询发布的行业白皮书显示,2018年中国人工智能基础数据服务市场规模为25.86亿元,预计2025年市场规模将突破113亿元,行业年复合增长率达到了23.5%.​ 作为人工智能产业的基石,数据 ...

  6. Wannafly Winter Camp 2020 Day 6I 变大! - dp

    给定一个序列,可以执行 \(k\) 次操作,每次选择连续的三个位置,将他们都变成他们的最大值,最大化 \(\sum a_i\) 需要对每一个 \(k=i\) 输出答案 \(n \leq 50, a_i ...

  7. MySQL int、char、varchar 最大值是多少?

    1.int(len) (1)max(len) = 255 (2)存储范围: 带符号整数:-2147483648-2147483647. 无符号(unsigned)整数:0-4294967295. 2. ...

  8. CGI、FastCGI和php-fpm的概念和区别和运行原理

    CGI: CGI的英文是(COMMON GATEWAY INTERFACE)公共网关接口,它的作用就是帮助服务器与语言通信,这里就是nginx和php进行通信,因为nginx和php的语言不通,因此需 ...

  9. 【spring boot】SpringBoot初学(6)– aop与自定义注解

    前言 github: https://github.com/vergilyn/SpringBootDemo 一.AOP 官方demo:https://github.com/spring-project ...

  10. WSL的ssh-agent问题

    WSL , 使用forwardAgent 的时候 , 用的以下两个应用 ubuntu 18.04 . ubuntu 这两个应用的 ssh-agent是有问题的 . 详见 https://github. ...