第四章——数学知识3

news2024/11/18 6:01:49

高斯消元

高斯消元可以用来解方程,可以在n三次方的时间复杂度内,求多元线性方程组。

答案只有三种情况,无解,无穷多组解,唯一解

输入一个包含 n 个方程 n 个未知数的线性方程组。

方程组中的系数为实数。

求解这个方程组。

下图为一个包含 m 个方程 n 个未知数的线性方程组示例:

输入格式

第一行包含整数 n。

接下来 n 行,每行包含 n+1 个实数,表示一个方程的 n 个系数以及等号右侧的常数。

输出格式

如果给定线性方程组存在唯一解,则输出共 n 行,其中第 i 行输出第 i 个未知数的解,结果保留两位小数。

如果给定线性方程组存在无数解,则输出 Infinite group solutions。

如果给定线性方程组无解,则输出 No solution。

数据范围

1≤n≤100,

所有输入系数以及常数均保留两位小数,绝对值均不超过 100。

输入样例:

3

1.00 2.00 -1.00 -6.00

2.00 1.00 -3.00 -9.00

-1.00 -1.00 2.00 7.00

输出样例:

1.00

-2.00

3.00

输入的时候,输入的是x1-xn的系数

上面的值输入后,方程是这样

初等行列变换:

  1. 把某一行乘一个非0的数

  1. 交换某2行

  1. 把某行的若干倍加到另一行去

之后变为上三角形式

上三角形式有三种:①完美阶梯型——有唯一解,②非完美阶梯型,左边没有未知数,右边的系数是非0的,即0=非0,此时无解。③出现0=0,有无穷多组解。

算法步骤:这里的目的是要消成上三角形式

  1. 枚举每一列C。

  1. 找到绝对值最大的一行。

  1. 将该行换到最上面去。

  1. 将该行第一个数变成1.这里等式俩边同时除2

  1. 将下面所有行的当前列全部消成0,这里用第二行减去第一行,第二行就变为0了

第三行,把第一行加到第三行即可。

  1. 把当前第2列的数变成1.

接下来先把最后一个方程第一个不为0的数变成1

最终变为这种形式

接下来直接解即可

#include<iostream>
#include<cmath>
using namespace std;
                                                 高斯消元法
const int N = 110;
const double eps = 1e-6;
int n;
double a[N][N];//系数数组
int gauss()
{
    int c, r;//c表示枚举的列,r表示枚举的行
    for (c = 0, r = 0; c < n; c++)//先从第0行,第0列开始枚举,枚举到最后一列为止
    {
        int t = r;
        for(int i=r;i<n;i++)
            if(fabs(a[i][c])>fabs(a[r][c]))//先找到这一列,绝对值最大的一行
                //如果当前这一行第C列的绝对值大于当前所存的绝对值,就换到这一行
                t=i;
        if (fabs(a[t][c])<eps)//如果当前这一列是0
            continue;
        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];
        //把下面所有行的第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++;
    }
    if (r < n)//剩下的方程的个数小于n,不是唯一解
    {
        for (int i = r; i < n; i++)
            if (fabs(a[i][n] > eps))
                return 2;
        return 1;
    }
    return 0;//唯一解
}
int main()
{
    cin >> n;
    for (int i = 0; i < n; ++i)
        for (int j = 0; j < n + 1; j++)
            cin >> a[i][j];
    int t = gauss();//高斯消元
    //0 表示唯一解 1表示无穷多组解 2表示无解
    if (t == 0)
    {
        for (int i = 0; i < n; i++)
            printf("%.2lf\n", a[i][n]);
    }
    else if (t == 1)
    {
        puts("Infinite group solutions");
    }
    else
    {
        puts("No solution");
    }
    return 0;
}

求组合数1

const int N = 2010, 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)//如果j为0,c[i][j]为1
                c[i][j] = 1;
            else c[i][j] = (c[i - 1][j] + c[i - 1][j - 1])%mod;//由于答案会很大,所以要给取模
}
int main()
{
    init();
    int n;
    cin >> n;
    while (n--)
    {
        int a, b;
        scanf("%d %d", &a, &b);
        printf("%d\n", c[a][b]);
    }
    return 0;
}

求组合数2

以下题解来自这里

const int N = 100010,mod=1e9+7;
typedef long long LL;
int fact[N], infact[N];
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;
}
int main()
{
    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;
    }
    int n;
    scanf("%d", &n);
    while (n--)
    {
        int a, b;
        scanf("%d %d", &a, &b);
        printf("%d\n", (LL)fact[a] * infact[b] % mod*infact[a-b]%mod);
    }
    return 0;
}

求组合数3

最重要的是这个,上面都是证明

typedef long long LL;
int p;
int qmi(int a, int k)
{
    int res = 1;
    while (k)
    {
        if (k & 1) res = (LL)res * a % p;
        a = (LL)a * a % p;
        k >>= 1;
    }
    return res;
}
int C(int a, int b)
{
    int res = 1;
    for (int i = 1, j = a; i <= b; i++,j--)
    {
        res = (LL)res * j % p;
        res = (LL)res * qmi(i, p - 2) % p;
    }
    return res;
}
int lucas(LL a, LL b)
{
    if (a < p && b < p) return C(a, b);
    return (LL)C(a % p, b % p) * lucas(a / p, b / p) % p;
}
int main()
{
    int n;
    cin >> n;
    while (n--)
    {
        LL a, b;
        cin >> a >> b >> p;
        cout << lucas(a, b) << endl;
    }
    return 0;
}

求组合数4

第一步分解质因数,第二部高精度乘法计算

  1. 筛素数,把1-5000内的素数筛出来

  1. 求每个质数的次数,用上图最后一个公式求

  1. 用高精度乘法,把所有质因子乘到一块去。

#include<vector>
using namespace std;
const int N = 5010;
int primes[N], cnt;
bool st[N];
int sum[N];
void get_primes(int n)
{
    for (int i = 2; i <= n; i++)
    {
        if (!st[i]) primes[cnt++] = i;
        for (int j = 0; primes[j] <= n / i; j++)
        {
            st[primes[j] * i] = true;
            if (i % primes[j] == 0)
                break;
        }
    }
}
int get(int n, int p)
{
    int res = 0;
    while (n)
    {
        res += n / p;
        n /= p;
    }
    return res;
}
vector<int> mul(vector<int> a, int b)
{
    vector<int> c;
    int t = 0;
    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;
}
int main()
{
    int a, b;
    cin >> a >>b;
    get_primes(a);//预处理出来1-a中的所有质数
    //接下来求每一个质数的次数
    for (int i = 0; i < cnt; i++)
    {
        int p = primes[i];
        sum[i] = get(a,p) - get(b,p) - get(a - b,p);
    }
    vector<int> res;
    res.push_back(1);
    for (int i = 0; i < cnt; i++)
    {
        for (int j = 0; j < sum[i]; j++)
        {
            res = mul(res, primes[i]);  
        }
    }
    for (int i = res.size() - 1; i >= 0; i--)
        printf("%d", res[i]);
    puts("");
    return 0;
}

容斥原理

满足条件的01序列

一共五种方案

我们转化成从原点走路径的问题,当有6个0和6个1,需要计算从0,0走到6,6共有多少种方案,上述题目求的是从0,0到3,3的距离

我们规定0代表向右走一格,1向上走一格。

若数字是100110001110,代表先网上走一格,再往右走俩格……,即每种排列都对应一条路径。

题目要求任意前缀0的个数要大于1的个数,即在坐标图中任意时刻x≥y,即任意时刻,都应该在绿颜色的边下面或在绿边。

即从0,0走到n,n所有不经过红颜色这条边的个数

从0,0到6,6共有C12 6种走法,再减去经过红颜色这条边的数。

这里黄边,圈出来的部分经过了红边,我们利用红边做轴对称即可得到正确的路径

6,6关于红颜色这条边做轴对称对应的坐标是5,7,即从0,0到6,6的所有路径中,减去0,0到5,7的所有路径,即可得到正确答案。

const int mod = 1e9 + 7;
typedef long long LL;
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;
}
int main()
{
    int n;
    cin >> n;
    int a = 2 * n, b = n;
    int res = 1;
    for (int i = a; i > a - b; i--)
        res = (LL)res * i % mod;
    for (int i = 1; i <= b; i++)
        res = (LL)res * qmi(i, mod - 2, mod) % mod;
    res = (LL)res * qmi(n + 1, mod - 2, mod) % mod;
    cout << res << endl;
    return 0;
}

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

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

相关文章

从0~1落地接口自动化测试,让你不再手忙脚乱丨轻松入门

接口自动化测试入门教程地址&#xff1a;https://www.bilibili.com/video/BV1914y1F7Bv/? 目录&#xff1a;导读 前言 为什么要做接口测试 理解接口和接口测试 如何落地接口自动化测试 结语 前言 对于初学者而言&#xff0c;如何从零开始落地接口自动化测试是一个难点&am…

c/c++:字符串str中寻找子串substr出现的次数

c/c&#xff1a;字符串str中寻找子串substr出现的次数 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;此时学会c的话&#xff0c; 我所知道的周边的会c的同学&#xff0c;可手握10多个offer&#xff0c;随心所欲&#xff0…

LeetCode:24. 两两交换链表中的节点

&#x1f34e;道阻且长&#xff0c;行则将至。&#x1f353; &#x1f33b;算法&#xff0c;不如说它是一种思考方式&#x1f340; 算法专栏&#xff1a; &#x1f449;&#x1f3fb;123 一、&#x1f331;24. 两两交换链表中的节点 题目描述&#xff1a;给你一个链表&#x…

第二章 Unity界面认识

本章节我们来认识一下Unity的主界面&#xff0c;如下所示 Unity的主界面虽然看的内容比较多&#xff0c;但是结构上还是比较清晰地&#xff0c;所以并不乱。从上到下&#xff0c;从左到右依次是菜单栏&#xff0c;工具栏&#xff0c;层次面板&#xff08;Hierarchy&#xff09;…

Docker Compose的常用命令与docker-compose.yml脚本属性配置

Docker Compose的常用命令与配置 常见命令ps&#xff1a;列出所有运行容器logs&#xff1a;查看服务日志输出port&#xff1a;打印绑定的公共端口build&#xff1a;构建或者重新构建服务start&#xff1a;启动指定服务已存在的容器stop&#xff1a;停止已运行的服务的容器&…

Android studio 使用入门

安装 安装JDK https://www.oracle.com/java/technologies/downloads/ 新增变量JAVA_HOME&#xff0c;值为JDK安装根目录 在path中增加 %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin; 安装 Android studio https://developer.android.google.cn/studio/ 注意&#xff1a;路径尽量不要包…

区间DP (Java) 解析/模板/案例

一. 区间DP简单介绍 区间DP&#xff0c;是经常会用到的、解决区间问题的一种方法&#xff0c;经常以动态规划&#xff08;dfs/记忆化搜索&#xff09;的形式展现&#xff0c;最核心的思想就是枚举区间&#xff08;枚举端点&#xff09;&#xff0c;寻找切割点&#xff0c;处理因…

java.util.List和java.util.Set区别

最近有个需求要求查询按照单号查询顺序&#xff0c;数据库是hbase,我看了之前代码没有通过查hbase进行排序&#xff0c;就问了前端看是否前端可以排序&#xff0c;答案是前端不会做排序&#xff1b;有2个接口其中之前的接口就是这样排序的&#xff0c;于是我就按个排查看不同之…

Java每日一练(20230426)

目录 1. 天际线问题 &#x1f31f;&#x1f31f;&#x1f31f; 2. 2 的幂 &#x1f31f;&#x1f31f; 3. 对称二叉树 &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每…

这可能是最全面的Redis面试八股文了

Redis连环40问&#xff0c;绝对够全&#xff01; Redis是什么&#xff1f; Redis&#xff08;Remote Dictionary Server&#xff09;是一个使用 C 语言编写的&#xff0c;高性能非关系型的键值对数据库。与传统数据库不同的是&#xff0c;Redis 的数据是存在内存中的&#xf…

jmeter(四)HTTP请求

启动jmeter&#xff0c;建立一个测试计划 这里再次说说怎么安装和启动jmeter吧&#xff0c;昨天下午又被人问到怎样安装和使用&#xff0c;我也是醉了&#xff1b;在我看来&#xff0c;百度能解决百分之八十的问题&#xff0c;特别是基础的问题。。。 安装&#xff1a;去官网…

状态设计模式解读

目录 问题引进 状态模式基本介绍 基本介绍 状态模式的原理类图 对原理类图的说明 状态模式解决 APP 抽奖问题 状态模式的注意事项和细节 问题引进 请编写程序完成 APP 抽奖活动 具体要求如下: 1) 假如每参加一次这个活动要扣除用户 50 积分&#xff0c;中奖概率是 10% …

尚融宝23-后端管理系统借款审核

目录 一、借款信息列表展示 &#xff08;一&#xff09;需求 &#xff08;二&#xff09;后端 &#xff08;三&#xff09;前端 二、借款详情 &#xff08;一&#xff09;需求 &#xff08;二&#xff09;后端 &#xff08;三&#xff09;前端 三、借款审批 &#xf…

YOLOv7训练自己的数据集(txt文件,笔记)

目录 1.代码下载 2.数据集准备&#xff08;.xml转.txt) &#xff08;1&#xff09;修改图像文件名 &#xff08;2&#xff09;图片和标签文件数量不对应&#xff0c;解决办法 &#xff08;3&#xff09;.xml转.txt &#xff08;4&#xff09;.txt文件随机划分出对应的训练…

记录自己第一次项目管理(附件:WBS计划与会议纪要模板)

记录自己第一次项目管理 前言 20**年新入职到一家公司&#xff0c;刚到就接到紧急任务&#xff0c;因为上一个后端跑路&#xff0c;现在系统上出现接口报错、假接口的问题&#xff0c;客户又着急验收&#xff0c;所以入职之后&#xff0c;一直在着急改代码。最后因为系统没有…

Nginx+Tomcat负载均衡及动态分离

一.Nginx负载均衡实现原理 Nginx实现负载均衡是通过反向代理实现 1、 反向代理原理 2、反向代理的概念 反向代理&#xff08;Reverse Proxy&#xff09;方式是指以代理服务器来接受internet上的连接请求&#xff0c;然后将请求转发给内部网络上的服务器&#xff0c;并将从服…

Promise--代码实现-- ajax 传统方式和 promise 方式和 promise 代码优化/重排 方式的对比--综合代码示例

目录 Promise Promise 基本介绍 Promise 应用实例 代码实现 monster.json monster_detail_1.json 先使用 ajax 传统方式完成, 问题分析(出现回调函数嵌套) 使用 promise 方式 示意图: 使用 promise 代码优化/重排 方式完成 get.js方法 注意事项和使用细节 综合代码 …

C语言学习分享(第五次)------函数

函数 1.前言2. 什么是函数3. 库函数3.1 为什么会有库函数3.2 如何学习库函数3.3 参考文档学习库函数3.31 strcpy函数3.32 memset函数3.33 使用库函数应该包含的头文件 4.自定义函数5.函数的参数5.1 交换两数题目详解 6. 函数的调用6.1 传址调用6.2 传值调用 7. 函数的嵌套调用和…

【机器学习】P25 随机森林算法(2) 实现 “波士顿房价” 预测

随机森林算法 Random Forest Algorithm 随机森林算法随机森林算法实现波士顿房价预测 随机森林算法 随机森林&#xff08;Random Forest&#xff09;算法 是一种 集成学习&#xff08;Ensemble Learning&#xff09;方法&#xff0c;它由多个决策树组成&#xff0c;是一种分类…

【RV1126】移植kaldi实时语音识别

文章目录 算法一、环境1.1 硬件环境--RV1126开发板1.2 交叉编译器1.3 需要Cmake版本大于3.1以上 二、交叉编译sherpa2.1 下载sherpa2.2 编译sherpa2.3 运行测试 三、下载模型四、语音测试4.1 单个语音文件解码测试4.2 开发板上使用alsa架构从MIC说话测试 算法 参考&#xff1a…