组合数的计算以及组合数对p取余后结果的计算
前奏:统计 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取余后结果的计算的更多相关文章
- 用shell脚本 计算两个数的加减乘除取余
#! /bin/bash # read -p '请输入数:' a //输入 read -p '请输入数:' b echo '$a+$b=' $(( a + b )) //输出 echo '$a-$b= ...
- ZZNU-oj-2141:2333--【O(N)求一个数字串能整除3的连续子串的个数,前缀和数组+对3取余组合数找规律】
2141: 2333 题目描述 “别人总说我瓜,其实我一点也不瓜,大多数时候我都机智的一批“ 宝儿姐考察你一道很简单的题目.给你一个数字串,你能判断有多少个连续子串能整除3吗? 输入 多实例输入,以E ...
- CJOJ 2255 【NOIP2016】组合数问题 / Luogu 2822 组合数问题 (递推)
CJOJ 2255 [NOIP2016]组合数问题 / Luogu 2822 组合数问题 (递推) Description 组合数\[C^m_n\]表示的是从n个物品中选出m个物品的方案数.举个例子, ...
- 大数计算_BigNum优化_加减乘除乘方取余_带注释_数组
#include <iostream> #include <algorithm> #include <cstring> #include <cstdlib&g ...
- python的加、减、乘、除、取整、取余计算
加法: 输入以下代码: >>>1+1 >>>1.0+1 减法: 输入以下代码: >>>1-2 >>>1.0-2 乘法: 输入以下 ...
- salesforce 零基础学习(四十三)运算取余
工作中遇到一个简单的小问题,判断两个数是否整除,如果不整除,获取相关的余数. 习惯java的我毫不犹豫的写下了代码 public Boolean isDivisibility(Integer divi ...
- 2014年百度之星程序设计大赛 - 初赛(第一轮) hdu Grids (卡特兰数 大数除法取余 扩展gcd)
题目链接 分析:打表以后就能发现时卡特兰数, 但是有除法取余. f[i] = f[i-1]*(4*i - 2)/(i+1); 看了一下网上的题解,照着题解写了下面的代码,不过还是不明白,为什么用扩展g ...
- 提高java编程质量 - (二)取余用偶判断,不要用奇判断
取余判断原则:取余用偶判断,不要用奇判断 先看一个 程序: package com.test; import java.util.Scanner; public class t1 { public s ...
- 洛谷 P1226 【模板】快速幂||取余运算
题目链接 https://www.luogu.org/problemnew/show/P1226 题目描述 输入b,p,k的值,求b^p mod k的值.其中b,p,k*k为长整型数. 输入输出格式 ...
随机推荐
- Python 静态类型检查 mypy 示例
以下所有例子都参考了最新版本的 Python 文档与 mypy 文档 必备条件 安装最新版本的 Python 和 mypy 要学会按需配置自己的编辑器,比如我的 VSCode 就装好了 Python ...
- Miller_Rabin()算法素数判定 +ollard_rho 算法进行质因数分解
//****************************************************************// Miller_Rabin 算法进行素数测试//速度快,而且可以 ...
- 0009 基于DRF框架开发(02 创建模型)
上一节介绍了DRF开发的基本流程,共五个步骤: 1 创建模型 2 创建序列化器 3 编写视图 4 配置URL 5 运行测试 本节主要讲解创建模型. 构建学校,教师,学生三个模型,这三个模型之间的关系是 ...
- python中的__dict__和dir()的区别
Python下一切皆对象,每个对象都有多个属性(attribute),Python对属性有一套统一的管理方案. __dict__与dir()的区别: dir()是一个函数,返回的是list: __di ...
- dos命令获取系统时间与变量定义
1.获取系统时间及格式化 参考文章: 1.1 cmd下获取系统时间 1.2 获取系统时间的DOS命令 2.变量定义 https://www.jb51.net/article/49197.htm 3.使 ...
- Sql Server2008忘记sa登陆密码
Sql的sa登陆密码忘记解决方法: 语句执行的前提: 1.系统可以登陆进去(当不记得sa密码的时候,可以使用windows用户验证的方式进行登陆) 2.平时用sa登陆,点了记住密码但是不记得密码是多少 ...
- 关闭Apache的目录浏览功能
一.默认情况 默认情况下,Apache的配置文件C:\web\apache2.4\conf/httpd.conf中有如下参数: 引用 <Directory "/var/www/html ...
- css动画 transition
比如输入框触交渐变 在原来的属性添加 : .form-control{-webkit-transition: all .3s; transition: all .3s;} .form-control: ...
- 设置display:inline-block 元素间隙
上代码: <div class="page"> <a href="" class="num">共1231条</ ...
- UnicodeDecodeError: 'gbk' codec can't decode byte 0xfe in position 45: illegal multibyte sequence
常见的一种解码错误如题目所示,下面介绍该错误的解决方法 (1).首先在打开文本的时候,设置其编码格式,如:open(‘1.txt’, encoding=’gbk’): (2).若(1)不能解决,可能是 ...