组合数的计算以及组合数对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为长整型数. 输入输出格式 ...
随机推荐
- Gin框架之参数绑定
为了能够更方便的获取请求相关参数,提高开发效率,我们可以基于请求的Content-Type识别请求数据类型并利用反射机制自动提取请求中QueryString.form表单.JSON.XML等参数到结构 ...
- 剑指offer-面试题55-平衡二叉树-递归
/* 题目: 判断二叉树是否为平衡二叉树. */ /* 思路: 判断二叉树的左子树和右子树高度相差是否为1. */ #include<iostream> #include<cstri ...
- pip 配置国内源
网上已经有很多人介绍了,我写在这儿就是为了找起来方便. https://www.cnblogs.com/schut/p/10410087.html 这篇博客还是很有意思的,他介绍了两种方法.可以一 ...
- IDEA如何恢复到以前的代码
虽然说IDEA的Ctrl+z撤销操作和Ctrl+Shift+Z重做操作为书写代码提供了很大的便利 但是在各种原因不小心失误撤销后又想不起来代码是怎么写的时候就非常尴尬,这时候就需要代码恢复到以前的状态 ...
- JS格式时间
Date.prototype.format = function(format) { var o = { "M+": this.getMonth() + 1, //month &q ...
- 安装MySQL被提示缺少msvcr120.dll,msvcp120.dll或提示0xc00007b错误
踩坑经历: 我的电脑昨天重装了win10系统,在安装MySQL时被提示缺少msvcr120.dll,我去下载msvcr120.dll后放入System32中,又被提示缺少msvcp120.dll,然后 ...
- 软件分享大会之Bonny使用感想
近日大一期末临近,处在计算机大类专业的我也即将面临专业分流.在软件工程这个新的开始前,未来的系主任组织了一次软件分享会,通过大二.大三学生向大一的我们的作品展示,提前让我们了解自制软件如现流行软件的不 ...
- linux命令su,sudo 使用和区别
1- sudo 与 su 两个命令的最大区别是: sudo 命令需要输入当前用户的密码,su 命令需要输入 root 用户的密码.另外一个区别是其默认行为.sudo 命令只允许使用提升的权限运行单个命 ...
- Aspcms标签大全及常用标签
相关解释:1.首页指的是index.html文件.列表页一般指newslist.html,productlist.html等文件,该文件对应于后台栏目添加或修改时的列表模板.内页一般指news.htm ...
- 论文阅读笔记(十二)【CVPR2018】:Exploit the Unknown Gradually: One-Shot Video-Based Person Re-Identification by Stepwise Learning
Introduction (1)Motivation: 大量标记数据成本过高,采用半监督的方式只标注一部分的行人,且采用单样本学习,每个行人只标注一个数据. (2)Method: 对没有标记的数据生成 ...