算法基础-数学知识-高斯消元、求组合数

news2025/1/15 16:41:44

高斯消元、求组合数

  • 高斯消元
    • 883. 高斯消元解线性方程组
  • 组合数
    • AcWing 885. 求组合数 I
    • AcWing 886. 求组合数 II
    • AcWing 887. 求组合数 III
    • AcWing 888. 求组合数 IV

高斯消元

  1. 找到当前列绝对值最大的数 所在的行
  2. 将改行的该列的系数变成1,其他列也要跟着变
  3. 将这行和最上面未处理的那行交换(不是第一行)
  4. 最上面那行的以下的所有行的该列消元
  5. 判断是否存在解 123三种情况
  6. 若有唯一解,则从最下面开始消元

883. 高斯消元解线性方程组

#include <iostream>
#include <algorithm>
#include <cmath>

using namespace std;
const int N = 110;
const double eps = 1e-6;//eps是epsilon,表示很小的值
double a[N][N];
int n;
int gauss()
{
    int c, r;
    for (c = 0, r = 0; c < n; ++ c) // ++ r不能放在这一行,因为不是每一个a[t][c]都合法
    {
        int t = r;
        for (int i = r; i < n; ++ i)
            if (fabs(a[t][c]) < fabs(a[i][c])) 
                t = i;
        if (fabs(a[t][c]) < eps) continue;//说明就没有未知数Xc,他的系数最大就是0
        //交换
        for (int i = c; i <= n; ++ i) swap(a[t][i], a[r][i]);
        //将这一行的这一列变成1
        for (int i = n; i >= c; -- i) a[r][i] /= a[r][c];//后面的状态需要第一个状态作为基准,因此从后面推

        //将下面的行对应的这一列消成0
        for (int i = r + 1; i < n; ++ i)
        {
            if (fabs(a[i][c]) > eps)
                for (int j = n; j >= c; -- j)
                    a[i][j] -= a[r][j] * a[i][c];
        }

        r ++;
    }
    //c此时=n
    if (r < c)// 说明剩下方程的个数是小于 n 的,说明不是唯一解,判断是无解还是无穷多解
    {// 因为已经是阶梯型,所以 r ~ n-1 的值应该都为 0
        for (int i = r; i < n; i ++ )// 
            if (fabs(a[i][n]) > eps)// a[i][n] 代表 b_i ,即 左边=0,右边=b_i,0 != b_i, 所以无解。
                return 2;
        return 1;// 否则, 0 = 0,就是r ~ n-1的方程都是多余方程
    }
    for (int i = r; i >= 0; -- i)//r此时=n-1
        for (int j = i + 1; j < n; ++ j)
            a[i][n] -= a[i][j] * a[j][n];
            
    return 0;
}
void solve()
{
    cin >> n;
    for (int i = 0; i < n; ++ i)
        for (int j = 0; j <= n; ++ j)
            cin >> a[i][j];   
    int t = gauss();
    if (t == 1) puts("Infinite group solutions");
    else if (t == 2) puts("No solution");
    else  
    {
        for (int i = 0; i < n; i ++ ) printf("%.2lf\n", a[i][n]);
    }
}
int32_t main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    int T = 1;
    //cin >> T;
    while (T --) solve();
    return 0;
}

组合数

在这里插入图片描述

  1. 递推就是Cba = Cba-1 + Cb-1a-1
  2. 预处理就是qmi (logN复杂度)结合模运算里面的逆元C^b^~a~ = a! / ((a-b)!*b!),提前将所有阶乘的逆元和阶乘的值算出来
  3. lucas定理证明我看了懵懵懂懂,记住结论就行

AcWing 885. 求组合数 I

#include <iostream>
#include <algorithm>
#include <cmath>

using namespace std;
const int N = 2e3 + 10, mod = 1e9 + 7;
int c[N][N];
void init()
{
    for (int i = 0; i < N; ++ i)
        for (int j = 0; j <= i; ++ j)
            if (j == 0) c[i][j] = 1;//i == j的情况可以通过前面处理好的递推出来
            else c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % mod;
}
void solve()
{
    int n;
    cin >> n;
    init();
    while (n -- )
    {
        int a, b;
        cin >> a >> b;
        cout << c[a][b] << endl;
    }
}
int32_t main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    int T = 1;
    //cin >> T;
    while (T --) solve();
    return 0;
}

AcWing 886. 求组合数 II

  1. 运用组合数的定义,即最基本的运算公式。
  2. 基本运算公式中含有除法,我们想把除法变成乘法。
  3. 前面说了除法变乘法,本题正好有取模预算,取模运算下除法变乘法可以用欧拉函数扩展。
  4. 模又是质数,可以用费马定理,费马定理可以用快速幂将N优化为logN复杂度
#include <iostream>
#include <algorithm>
#include <cmath>

using namespace std;
typedef long long LL;
const int N = 1e5 + 10, mod = 1e9 + 7;
int fact[N];//fact[i]表示i的阶乘
int infact[N];//infact[i]表示i阶乘的逆元,可以由infact[i - 1] * i的逆元获得
int qmi(int a, int k, int p)
{
    int res = 1;
    while (k)
    {
        if (k & 1) res = (LL)res * a % p;
        a = (LL)a * a % p;
        k >>= 1;
    }
    return res;
}
void solve()
{
    int n;
    cin >> n;
    fact[0] = infact[0] = 1;
    for (int i = 1; i < N; i ++ )
    {
        fact[i] = (LL)fact[i - 1] * i % mod;//记得多次取模
        infact[i] = (LL)infact[i - 1] * qmi(i, mod - 2, mod) % mod;
    }
    while (n -- )
    {
        int a, b;
        cin >> a >> b;
        printf("%d\n", (LL)fact[a] * infact[b] % mod * infact[a - b] % mod);
    }
}
int32_t main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    int T = 1;
    //cin >> T;
    while (T --) solve();
    return 0;
}

AcWing 887. 求组合数 III

在这里插入图片描述

#include <iostream>
#include <algorithm>
#include <cmath>

using namespace std;
typedef long long LL;

int qmi(int a, int k, int p)
{
    LL res = 1;
    while (k)
    {
        if (k & 1) res = res * a % p;
        a = (LL)a * a % p;
        k >>= 1;
    }
    return res;
}
int C(LL a, LL b, int p)//好坑,a和b可能是LL
{
    if (a < b) return 0;
    if (b > a - b) b = a - b; //Ca b = Ca a - b,可以自己举个例子
    int x = 1, y = 1;
    for (int i = 0; i < b; ++ i)//就是C^b^~a~ = a! / ((a-b)!*b!)
    {
        x = (LL)x * (a - i) % p;
        y = (LL)y * (i + 1) % p;
    }
    return (LL)x * qmi(y, p - 2, p) % p;//p一定为质数
}

int lucas(LL a, LL b, int p)
{
    if (a < p && b < p) return C(a, b, p);
    return (LL)C(a % p, b % p, p) * lucas(a / p, b / p, p) % p;
}

void solve()
{
    int n;
    cin >> n;
    LL a, b;
    int p;
    while (n -- )
    {
        cin >> a >> b >> p;//好坑,a和b可能是LL
        cout << lucas(a, b, p) << endl;
    }    
}
int32_t main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    int T = 1;
    //cin >> T;
    while (T --) solve();
    return 0;
}

AcWing 888. 求组合数 IV

在这里插入图片描述

#include <iostream>
#include <algorithm>
#include <cmath>

using namespace std;
const int N = 5e3;
int primes[N], cnt;
int sum[N];
bool st[N];
void init(int a)//初始化获得1-a之间所有的质数,数论里面学过 a一定可以分解成质因数的乘积
{
    for (int i = 2; i <= a; ++ i)
    {
        if (!st[i]) primes[cnt++] = i;
        for (int j = 0; primes[j] <= a / i; ++ j)
        {
            st[i * primes[j]] = true;
            if (i % primes[j] == 0) break;
        }       
    }
}

int get(int x, int p)//获得每个质因数的数量
{
    int res = 0;
    while (x)
    {
        res += x / p;
        x /= p;
    }
    return res;
}

vector<int> mul(vector<int> a, int b) //高精度乘法
{
    int t = 0;
    vector<int> C;
    for (int i = 0; i < a.size(); ++ i)
    {
        t += a[i] * b;
        C.push_back(t % 10);
        t /= 10;
    }

    while (t)
    {
        C.push_back(t % 10);
        t /= 10;
    }

    return C;
}

void solve()
{
    int a, b;
    cin >> a >> b;
    init(a);   
    for (int i = 0; i < cnt; ++ i)//计算结果中的所有质因数的数量
        sum[i] = get(a, primes[i]) - get(a - b, primes[i]) - get(b, primes[i]);
    

    vector<int> res;
    res.push_back(1);
    for (int i = 0; i < cnt; ++ i)
        for (int j = 1; j <= sum[i]; ++ j)
            res = mul(res, primes[i]);
            
    for (int i = res.size() - 1; i >= 0; -- i) cout << res[i];
}
int32_t main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    int T = 1;
    //cin >> T;
    while (T --) solve();
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/980889.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用GPT-4生成训练数据微调GPT-3.5 RAG管道

OpenAI在2023年8月22日宣布&#xff0c;现在可以对GPT-3.5 Turbo进行微调了。也就是说&#xff0c;我们可以自定义自己的模型了。然后LlamaIndex就发布了0.8.7版本&#xff0c;集成了微调OpenAI gpt-3.5 turbo的功能 也就是说&#xff0c;我们现在可以使用GPT-4生成训练数据&a…

taro vue3 ts nut-ui 项目

# 使用 npm 安装 CLI $ npm install -g tarojs/cli 查看 Taro 全部版本信息​ 可以使用 npm info 查看 Taro 版本信息&#xff0c;在这里你可以看到当前最新版本 npm info tarojs/cli 项目初始化​ 使用命令创建模板项目&#xff1a; taro init 项目名 taro init myApp …

《TCP/IP网络编程》阅读笔记--基于UDP的服务器端/客户端

目录 1--TCP和UDP的主要区别 2--基于 UDP 的数据 I/O 函数 3--基于 UDP 的回声服务器端/客户端 4--UDP客户端Socket的地址分配 5--UDP存在数据边界 6--UDP已连接与未连接的设置 1--TCP和UDP的主要区别 ① TCP 提供的是可靠数据传输服务&#xff0c;而 UDP 提供的是不可靠…

使用Java分析器优化代码性能,解决OOM问题

有的时候博客内容会有变动&#xff0c;首发博客是最新的&#xff0c;其他博客地址可能会未同步,认准https://blog.zysicyj.top 首发博客地址 背景 最近我一直在做性能优化&#xff0c;对一个单机应用做性能优化。主要是涉及到解析和导入导出相关的业务。 大致说一下这个单机应用…

算法 数据结构 递归插入排序 java插入排序 递归求解插入排序算法 如何用递归写插入排序 插入排序动图 插入排序优化 数据结构(十)

1. 插入排序&#xff08;insertion-sort&#xff09;&#xff1a; 是一种简单直观的排序算法。它的工作原理是通过构建有序序列&#xff0c;对于未排序数据&#xff0c;在已排序序列中从后向前扫描&#xff0c;找到相应位置并插入 算法稳定性: 对于两个相同的数&#xff0c;经过…

Matlab进阶绘图第28期—带回归趋势线的密度散点图

在之前的文章中&#xff0c;分享了Matlab密度散点图的绘制方法&#xff1a; 进一步&#xff0c;假如我们需要计算、添加散点的拟合线&#xff0c;该怎么操作呢&#xff1f; 本期就来分享一下带回归趋势线的密度散点图的绘制方法&#xff0c;先来看一下成品效果&#xff1a; 特…

iOS开发Swift-10-位置授权, cocoapods,API,天气获取,城市获取-和风天气App首页代码

1.获取用户当前所在的位置 在infi中点击加号,选择权限:当用户使用app的时候获取位置权限. 填写使用位置权限的目的. 2.获取用户的经纬度. ViewController: import UIKit import CoreLocationclass ViewController: UIViewController, CLLocationManagerDelegate { //遵循CLL…

C#进阶 多个泛型约束

using System; using System.Collections; using System.Collections.Generic; using System.Linq; using UnityEngine;public class A02_Generic : MonoBehaviour {[ContextMenu("测试Start")]// Start is called before the first frame updatevoid Start(){Person…

Java SPI的原理和实践

Java SPI的概念和术语 SPI&#xff1a;全称是Service Provider Interface它是从Java 6开始引入的&#xff0c;是一种基于ClassLoader来发现并加载服务的机制。一个标准的SPI&#xff0c;由3个组件构成&#xff0c;分别是&#xff1a; Service - 服务接口&#xff1a;是一个公…

简单理解微服务限流、降级、熔断

微服务限流、降级、熔断分别都是什么意思&#xff0c;我们平时工作中为什么要关注这些东西呢&#xff1f; 公司不断的发展壮大&#xff0c;一开始处于蛮荒时代&#xff0c;咱们从单体应用过渡到微服务的时候&#xff0c;可能还是那一套单体的思想&#xff0c;再加上用户量可能…

VIT理论代码详解

将图像输入到transformer的思想 把每个像素点按照顺序拿出来&#xff0c;作为token&#xff0c;这样做的话输入参数规模是&#xff1a;假如是1通道的灰度图&#xff1a; 224x224x150176&#xff0c;bert才512&#xff0c;是bert的100倍。 改进方法&#xff1a; VIT模型架构图…

前端代理报错Error occured while trying to proxy to: localhost:端口

webpack配置进行前端代理时&#xff0c; 报错信息如下&#xff1a;(DEPTH_ZERO_SELF_SIGNED_CERT) 需设置&#xff1a;secure为false即可解决此报错 // webpack配置前端代理config["/test"]{target: https://xxxx.com,changeOrigin: true,secure: false // 这个配置…

设计模式(1) - UML类图

1、前言 最近在阅读 Android 源码&#xff0c;时常碰到代码中有一些巧妙的写法&#xff0c;简单的如 MediaPlayerService 中的 IFactory&#xff0c;我知道它是工厂模式&#xff0c;但是却不十分清楚它为什么这么用&#xff1b;复杂点的像 NuPlayer 中的 DeferredActions 机制…

云原生Kubernetes:kubectl管理命令

目录 一、理论 1.kubectl 管理命令 2.项目的生命周期 二、实验 1.kubectl 管理命令 2.项目的生命周期 三、总结 一、理论 1.kubectl 管理命令 &#xff08;1&#xff09;陈述式资源管理方法 kubernetes集群管理集群资源的唯一入口是通过相应的方法调用apiserver的接口…

进入低功耗和唤醒

休眠模式 进入休眠模式 如果使用 WFI 指令进入睡眠模式&#xff0c;则嵌套向量中断控制器 (NVIC) 确认的任意外设中断都会 将器件从睡眠模式唤醒。 如果使用 WFE 指令进入睡眠模式&#xff0c;MCU 将在有事件发生时立即退出睡眠模式。唤醒事件可 通过以下方式产生&#xff…

转载: 又拍云【PrismCDN 】低延时的P2P HLS直播技术实践

低延时的P2P HLS直播技术实践本文是第二部分《PrismCDN 网络的架构解析,以及低延迟、低成本的奥秘》低延时的P2P HLS直播技术实践 [首页 > Open Talk NO.41 | 2018 音视频技术沙龙深圳站 > 低延时 WebP2P 直播技术实践https://opentalk-blog.b0.upaiyun.com/prod/2018-0…

maven管理android项目

maven管理android项目 1.安装maven-android-sdk-deployer&#xff0c;下载地址&#xff1a;https://github.com/mosabua/maven-android-sdk-deployer 2.解压缩大英文路径文件夹 3.在压缩后的根目录执行mvn clean install -P 2.3.3&#xff08;2.3.3指的是android版本号&#x…

传输层协议--UDP

引入 传输层负责数据能够从发送端传输到接收端。 端口号&#xff08;Port&#xff09; 端口号标识了一个主机上进行通信的一个进程。 两个问题&#xff1a; 1. 一个进程可以绑定多个端口号吗&#xff1f;--可以 2.一个端口号可以绑定多个进程吗&#xff1f;--不可以 我们…

OpenCV(二十二):均值滤波、方框滤波和高斯滤波

目录 1.均值滤波 2.方框滤波 3.高斯滤波 1.均值滤波 OpenCV中的均值滤波&#xff08;Mean Filter&#xff09;是一种简单的滤波技术&#xff0c;用于平滑图像并减少噪声。它的原理非常简单&#xff1a;对于每个像素&#xff0c;将其与其周围邻域内像素的平均值作为新的像素值…

Python实现猎人猎物优化算法(HPO)优化BP神经网络回归模型(BP神经网络回归算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 猎人猎物优化搜索算法(Hunter–prey optimizer, HPO)是由Naruei& Keynia于2022年提出的一种最新的…