组合数的计算以及组合数对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数据类型(第二弹)
针对上一篇博文提出的若干种python数据类型,笔者将在本文和后续几篇博文中详细介绍. 本文着重介绍python数据类型中的整数型.浮点型.复数型.布尔型以及空值. 对于整数型.浮点型和复数型数据,它 ...
- JavaScript的语法、数据类型、基本算数和逻辑运算操作
str.toString() 可以把字符串.数值.布尔值.对象转为字符串 String(str) 任何数值强制转换为字符串类型 <!DOCTYPE html> <html lang= ...
- 本地服务开启MySQL57提示本地计算机上MySQL服务启动后停止。。。。
1.首先以管理员身份启动cmd,要不然服务禁止访问. 2.然后在cmd中输入 mysqld --remove mysql或者mysqld --remove mysql57来移除服务. 3.然后进入My ...
- SpringBoot导出excel数据报错Could not find acceptable representation
转自:https://blog.csdn.net/mate_ge/article/details/93518286?utm_source=distribute.pc_relevant.none-tas ...
- 报错:无法加载文件 D:\nodejs\node_global\webpack.ps1,因为在此系统上禁止运行脚本...
解决报错:(1)以管理员身份运行vs code (2)在终端执行:get-ExecutionPolicy,显示Restricted(表示状态是禁止的) [受限制的.保密的] (3)在终端执行:set ...
- javaweb 公文流转系统制作
该系统主要的要求就是实现公文的流转审核,用户有多重类型,在不同用户登录的时候要进入不同的页面,并能执行他们的权限. 用户分四种,普通部门(可以草拟公文并提交),办公室(接受普通部门的公文并编辑,最后提 ...
- 我的JAVA环境搭建
每次重装系统后的开发环境搭建,总是会花费大量的时间精力,软件下载安装啦,配置修改啦等等,索性把这些流程记录一下,毕竟时间就是金钱. 软件列表 JDK1.8 IntelliJ IDEA Navicat数 ...
- sql-labs 18-20(sqlmap注入)
这三题主要是关于HTTP头部的注入 常见的HTTP注入点产生位置为 [Referer].[X-Forwarded-For].[Cookie].[X-Real-IP].[Accept-Language] ...
- web做题记录
2020.1.19 南邮ctf 签到题 题目:key在哪里? 在火狐浏览器中右键选择打开查看源代码,在源代码可以看到如下 因为是第一次做这个题,不知道提交啥,我先提交了“admiaanaaaaaaaa ...
- BDA3 Chapter 1 Probability and inference
1. uncertainty aleatoric uncertainty 偶然不确定性 epistemic uncertainty 认知不确定性 2. probability VS likelihoo ...