数学知识总结

news2024/11/25 16:48:27

素数

质数/素数定义

        在大于1的整数中,如果只包含1和本身这两个约数,就被称为质数,或者叫素数


判断素数(试除法)

约数有一个重要的性质:

假设n代表数字,d代表n的一个约数

即d能整除n(d|n)

那么n/d为n的另外一个约数

即n/d能整除d(n/d | n)

简单思路:

模板:

bool is_prime(int n)
{
    if (n <= 1) return false;
    
    for (int i = 2; i <= n / i; i ++ )
      if (n % i == 0) return false;
     
    return true;
}

 866. 试除法判定质数

#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;

bool is_prime(int n)
{
    if (n <= 1) return false;
    
    for (int i = 2; i <= n / i; i ++ )
      if (n % i == 0) return false;
     
    return true;
}
int main()
{
    int n;
    cin >> n;
    
    while (n --)
    {
        int a;
        cin >> a;
        if (is_prime(a)) puts("Yes");
        else puts("No");
    }
    
    return 0;
}

 


分解质因数(试除法)

从小到大枚举所有的数

为什么不需要判断是否为质因子?

因为i是n的因子,即n是i的倍数,当枚举的到i时,n中已经不包含有2~i-1的因子,即i中也不包含,2~i-1的因子,所以i是质数

n中最多只包括一个大于sqrt(n)的质因子

如果最后剩下一个大于1的数,那就是大于sqrt(n)的质因子

模板:

​
void divide(int n)
{
    for (int i = 2; i <= n / i; i ++ )
    {
        if (n % i == 0)
        {
            int cnt = 0;
             while (n % i == 0)
             {
                 cnt ++;
                 n /= i;
             }
             printf("%d %d\n", i, cnt);
        }
    }
    if (n > 1) printf("%d %d\n", n, 1);
    printf("\n");
}

​

acwing 867. 分解质因数

​​​​​​#include <iostream>
#include <algorithm>

using namespace std;


void divide(int n)
{
    for (int i = 2; i <= n / i; i ++ )
    {
        if (n % i == 0)
        {
            int cnt = 0;
             while (n % i == 0)
             {
                 cnt ++;
                 n /= i;
             }
             printf("%d %d\n", i, cnt);
        }
    }
    if (n > 1) printf("%d %d\n", n, 1);
    printf("\n");
}

int main()
{
    int n;
    scanf("%d", &n);
    
    while (n --)
    {
        int a;
        scanf("%d", &a);
        divide(a);
    }
    
    return 0;
}

 


  埃氏筛法

算法思路:

 模板:

void gets_prime(int n)
{
    for (int i = 2; i <= n; i ++ )
    {
        if (!st[i])
        {
            cnt ++;
            for (int j = i * 2; j <= n; j += i) st[j] = true;
        }
    }
}

868. 筛质数

#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;
const int N = 1000010;
bool st[N];
int cnt;

void gets_prime(int n)
{
    for (int i = 2; i <= n; i ++ )
    {
        if (!st[i])
        {
            cnt ++;
            for (int j = i * 2; j <= n; j += i) st[j] = true;
        }
    }
}
int main()
{
    int n;
    cin >> n;
    gets_prime(n);
    cout << cnt << endl;
}

 


 线性筛(欧拉筛法)

算法思路:

 

模板:

void oula(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[i * primes[j]] = true;
            if (i % primes[j] == 0) break;
        }
    }
}

 868. 筛质数

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 1000010;
int primes[N];
bool st[N];
int cnt;

void oula(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[i * primes[j]] = true;
            if (i % primes[j] == 0) break;
        }
    }
}

int main()
{
    int n;
    cin >> n;
    oula(n);
    cout << cnt << endl;
}

 




约数

试除法

思路:

模板:


int res = 0;
for (int i = 1; i <= n / i; i ++ )
{
    if (n % i == 0)
    {
        if (i == n / i) res += 2;
        else res += 1;
    }
}

 —————————————这就是纯暴力解法,时间复杂度高——————————————


通过算数基本定理来求约数个数

思路:

 模板:

unordered_map<int, int> prime;//prime[质因子] = 次方
for (int i = 2; i <= x / i; i ++ )//分解质因数
{
    if (x % i == 0)
    {
        while (x % i == 0)
        {
            x /= i;
            prime[i] ++;
        }

    }
}
if (x > 1) prime[x] ++;
long long res = 1;
for (auto it = prime.begin(); it != prime.end(); it ++)
{
    res = res * (prime->second + 1);
}

870. 约数个数

输入样例: 

3
2
6
8

代码展示:

#include <iostream>
#include <algorithm>
#include <cstring>
#include <unordered_map>

using namespace std;

typedef long long LL;
const int mod = 1e9 + 7;

int main()
{
   int n;
   scanf("%d",&n);
   
   unordered_map<int, int> prime;
   
   while (n --)
   {
       int x;
       cin >> x;
       for (int i = 2; i <= x / i; i ++ )
       {
            while (x % i == 0)
            {
                x /= i;
                prime[i] ++;
            }
       }
       if (x > 1) prime[x] ++;
   }
   
   LL res = 1;
   for (auto p : prime) res = res * (p.second + 1) % mod;
   printf("%lld\n",res);
}

————————————————————next—————————————————————


通过算术基本定理求约数之和 

思路:

模板: 

unordered_map<int, int> prime;//prime[质因子] = 次方
for (int i = 2; i <= x / i; i ++ )//分解质因数
{
    if (x % i == 0)
    {
        while (x % i == 0)
        {
            x /= i;
            prime[i] ++;
        }

    }
}
if (x > 1) prime[x] ++;
long long res = 1;
for (auto it = prime.begin(); it != prime.end(); it ++)
{
     int a = it->first, b = it->second;
     long long t = 1;
     for (int i = 0; i < b; i ++) t = t * a + 1;
     res = res * t;  
}

871. 约数之和

输入样例:

3
2
6
8

 代码展示:

#include <iostream>
#include <algorithm>
#include <cstring>
#include <unordered_map>

using namespace std;

typedef long long LL;
const int mod = 1e9 + 7;

int main()
{
    int n;
    scanf("%d",&n);
    
    unordered_map<int, int> prime;
    
    while (n --)
    {
        int x;
        cin >> x;

        for (int i = 2; i <= x / i; i ++ )
        {
            while (x % i == 0)
            {
                prime[i] ++;
                x /= i;
            }
        }
        if (x > 1) prime[x] ++;
    }
    LL res = 1;
    for (auto p : prime)
    {
        int a = p.first, b = p.second;
        LL t = 1;
        for (int i = 0; i < b; i ++ ) t = (t * a + 1) % mod;
        res = res * t % mod;
    }
   cout << res << endl;
}

———————————————————next—————————————————————


求最大公约数 

思路:

模板: 

 int gcd(int a, int b)
{
    return b ? gcd(b, a % b) : a;
}

输入样例:

2
3 6
4 6

 AcWing 872. 最大公约数

代码展示:

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

int gcd(int a, int b)
{
    return b ? gcd(b, a % b) : a;
}

int main()
{
    int n;
    cin >> n;
    
    while (n --)
    {
        int a, b;
        cin >> a >> b;
        int ans = gcd(a, b);
        cout << ans << endl;
    }
    
    return 0;
}

欧拉函数

基本思路:

 

 模板(暴力):

long long res = x;
for (int i = 2; i <= x / i; i ++ )
{
    if (x % i == 0)
    {
        while (x % i == 0) x /= i;
        res = res * (i - 1) / i;
    }
}
if (x > 1) res = res * (x - 1) / x;

Acwing873. 欧拉函数

#include <iostream>
#include <algorithm>

using namespace std;

int main()
{
    int n;
    cin >> n;
    
    while (n --)
    {
        int x;
        cin >> x;
        
        long long res = x;
        for (int i = 2; i <= x / i; i ++ )
        {
            if (x % i == 0)
            {
                while (x % i == 0) x /= i;
                res = res * (i - 1) / i;
            }
        }
        if (x > 1) res = res * (x - 1) / x;
        cout << res << endl;
    }
}

 模板(线性筛法):

const int N = 1e6 + 10;
int primes[N], cnt;
bool st[N];
int phi[N];

void oula(int x)
{
    phi[1] = 1;
    for (int i = 2; i <= x; i ++)
    {
        if (!st[i])
        {
            primes[cnt ++] = i;
            phi[i] = i - 1;
        }
        for (int j = 0; primes[j] <= x / i; j ++)
        {
            st[i * primes[j]] = true;
            phi[i * primes[j]] = primes[j] * phi[i] * (primes[j] - 1) / primes[j];
            if (i % primes[j] == 0)
            {
                phi[i * primes[j]] = primes[j] * phi[i];
                break;
            } 
        }
    }
}

运用线性筛算欧拉函数思路:

 

Acwing874. 筛法求欧拉函数

#include <iostream>
#include <algorithm>

using namespace std;

const int N = 1e6 + 10;
int primes[N], cnt;
bool st[N];
int phi[N];

void oula(int x)
{
    phi[1] = 1;
    for (int i = 2; i <= x; i ++)
    {
        if (!st[i])
        {
            primes[cnt ++] = i;
            phi[i] = i - 1;
        }
        for (int j = 0; primes[j] <= x / i; j ++)
        {
            st[i * primes[j]] = true;
            phi[i * primes[j]] = primes[j] * phi[i] * (primes[j] - 1) / primes[j];
            if (i % primes[j] == 0)
            {
                phi[i * primes[j]] = primes[j] * phi[i];
                break;
            } 
        }
    }
}
int main()
{
    int n;
    cin >> n;
   
    oula(n);
    long long res = 0;
    for (int i = 1; i <= n; i ++) res += phi[i];
    cout << res << endl;
   
}

 




快速幂

基本思路:

模板:

typedef long long LL;

LL qmi(int a, int k, int p)
{
    LL res = 1;
    while (k)
    {
        if (k & 1) res = res * a % p;
        k >>= 1;
        a = (LL)a * a % p;
    }
    return res;
}

 AcWing 875. 快速幂

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

typedef long long LL;

LL qmi(int a, int k, int p)
{
    LL res = 1;
    while (k)
    {
        if (k & 1) res = res * a % p;
        k >>= 1;
        a = (LL)a * a % p;
    }
    return res;
}
int main()
{
    int n;
    cin >> n;
    
    while (n --)
    {
        int a, k, p;
        cin >> a >> k >> p;
        cout << qmi(a, k, p) << endl;
    }
}

 快速幂求逆元思路:

 AcWing 876. 快速幂求逆元  

#include <iostream>
#include <algorithm>

using namespace std;

typedef long long LL;

LL qmi(int a, int k, int p)
{
    LL res = 1;
    while (k)
    {
        if (k & 1) res = res * a % p;
        k >>= 1;
        a = (LL) a * a % p;
    }
    return res;
}
int main()
{
    int n;
    cin >> n;
    
    while (n --)
    {
        int a, p;
        cin >> a >> p;
        if (a % p) cout << qmi(a, p - 2, p) << endl;
        else puts("impossible");
    }
}

 




扩展欧几里得

基本思路:

模板:

int exgcd(int a, int b, int &x, int &y)
{
    if (b == 0)
    {
        x = 1, y = 0;
        return a;
    }
    int d = exgcd(b, a % b, y, x);
    y = y - a / b * x;
    return d;
}

 Acwing877. 扩展欧几里得算法

#include <iostream>
#include <algorithm>

using namespace std;

int exgcd(int a, int b, int &x, int &y)
{
    if (b == 0)
    {
        x = 1, y = 0;
        return a;
    }
    int d = exgcd(b, a % b, y, x);
    y = y - a / b * x;
    return d;
}
int main()
{
    int n;
    cin >> n;
    while (n --)
    {
        int a, b, x, y;
        cin >> a >> b;
        exgcd(a, b, x, y);
        cout << x << ' ' << y << endl;
    }
}

 裴蜀定理:

对任何整数a、b和它们的最大公约数d,关于未知数x和y的线性不定方程(称为裴蜀等式):若a,b是整数,且gcd(a,b)=d,那么对于任意的整数x,y,ax+by都一定是d的倍数,特别地,一定存在整数x,y,使ax+by=d成立。

 Acwing878. 线性同余方程

#include <iostream>
#include <algorithm>

using namespace std;

typedef long long LL;
int exgcd(int a, int b, int &x, int &y)
{
    if (b == 0)
    {
        x = 1, y = 0;
        return a;
    }
    int d = exgcd(b, a % b, y, x);
    y = y - a / b * x;
    return d;
}
int main()
{
    int n;
    cin >> n;
    while (n --)
    {
        int a, b, m, x, y;
        cin >> a >> b >> m;
        int d = exgcd(a, m, x, y);
        if (b % d) puts("impossible");
        else cout << (LL)x * (b / d) % m << endl;
    }
}

 

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

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

相关文章

visual studio安装时候修改共享组件、工具和SDK路径方法

安装了VsStudio后,如果自己修改了Shared路径&#xff0c;当卸载旧版本&#xff0c;需要安装新版本时发现&#xff0c;之前的Shared路径无法进行修改&#xff0c;这就很坑爹了&#xff0c;因为我运行flutter程序的时候&#xff0c;报错找不到windows sdk的位置&#xff0c;所以我…

Windows用VM虚拟机安装MacOS Ventura 13.6系统全流程教程(附资源)

安装成果&#xff1a; 所需容量&#xff1a;至少40GB的硬盘空间&#xff0c;推荐80GB以上。 所需资源 VMware虚拟机激活密钥&#xff1a;VMware Workstation Pro 17.0.2MacOS Ventura 13.6的ISO镜像MacOS的解锁工具卡顿优化工具&#xff1a;beamoff 有人反馈说需要能用的ISO镜…

mysql中特殊字符存储,如表情字符

一.问题&#xff1a;出现下面异常说明是不能存储特殊字符 ### Cause: java.sql.SQLException: Incorrect string value: \xF0\x9F\x98\x81 for column column1 at row 1 ; uncategorized SQLException; SQL state [HY000]; error code [1366]; Incorrect string value: \xF0\x…

UPS 原理和故障案例分享

摘要:不间断电源UPS (Uninterruptible Power System)&#xff0c;主要是由整流器、 逆变器、静态旁路和储能装置等组成;具备高可靠性、高可用性和高质量的独立 电源。通过对收集的 UPS 故障案例进行分析&#xff0c;从施工&#xff0c;调试和运行三个方面筛选 出四个故障案例与…

构建高效问题解答平台:使用Cpolar和Tipas在Ubuntu上搭建专属问答网站

文章目录 前言2.Tipask网站搭建2.1 Tipask网站下载和安装2.2 Tipask网页测试2.3 cpolar的安装和注册 3. 本地网页发布3.1 Cpolar临时数据隧道3.2 Cpolar稳定隧道&#xff08;云端设置&#xff09;3.3 Cpolar稳定隧道&#xff08;本地设置&#xff09; 4. 公网访问测试5. 结语 前…

什么是实验室超声消泡机?工作原理是怎样的?

超声波消泡设备也叫超声波脱气机、超声波消泡机、超声波消泡器。超声波在液体中产生空化作用,使得液体中溶解的气体(如:空气)不断凝聚,成为很细小的气泡,最后成为球状气泡脱离液体表面&#xff0c;从而达到液体脱气、液体消泡的目的。 实验室超声消泡机工作原理&#xff1a; …

买了个Oppo Reno6用于测试

这一段时间开发摄像头APP&#xff0c;一直用手头的主力机。摄像头APP要求经常拔插&#xff0c;担心损坏。而手头的几个USB线似乎也有问题&#xff0c;经常连着电脑就断线。于是决定买个手机用于测试。 经过挑选买了个二手的RENO6&#xff0c;个头小&#xff0c;与手头的X70 PR…

Numpy(二) 元素与数组的操作

Numpy(二) 元素与数组的操作 一、元素的索引访问 1.一维数组索引访问 ①Numpy一维数组索引访问与python内置序列类型索引访问一样&#xff0c;都使用中括号下标&#xff08;[index]&#xff09; ②正值索引/负值索引 正值索引&#xff1a;0 1 2 3 4 5 a数组&#xff…

Android Studio Giraffe | 2022.3.1

Android Gradle 插件和 Android Studio 兼容性 Android Studio 构建系统以 Gradle 为基础&#xff0c;并且 Android Gradle 插件 (AGP) 添加了几项专用于构建 Android 应用的功能。下表列出了各个 Android Studio 版本所需的 AGP 版本。 如果您的项目不受某个特定版本的 Andr…

专业课138,总分390+,西工大,西北工业大学827信号与系统考研分享

数学一 考研数学其实严格意义上已经没有难度大小年之分了&#xff0c;说21年难的会说22年简单&#xff0c;说22年简单的做23年又会遭重&#xff0c;所以其实只是看出题人合不合你的口味罢了&#xff0c;建议同学不要因偶数年而畏惧&#xff0c;踏踏实实复习。资料方面跟谁就用…

实用的窗口管理软件:Display Maid for Mac

Display Maid 是一款用于 macOS 平台的窗口管理工具&#xff0c;它可以帮助用户更高效地管理和组织他们的应用程序窗口。Display Maid 提供了一系列功能和快捷键&#xff0c;使用户可以轻松地调整窗口的位置、大小和布局&#xff0c;以适应不同的工作环境和需求。 以下是 Disp…

基于Java的家庭食谱管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

ubuntu服务器启动报错UNEXPECTED INCONSISTENCY解决方法

遇到这种情况,按照出错提示来进行处理一般不会有问题,我这里尝试使用命令fsck修复出错的分区: 我使用的是&#xff1a;umount /dev/sdb3 然后提示卸载错误&#xff08;所以这一步不是到是否有用&#xff09; 修复: fsck -y /dev/sdb3 ,最后挂载分区上去:mount /dev/sdb3 /da…

基于ebpf的性能工具-bpftrace

在前面我已经分享了关于ebpf入门的文章&#xff1a;基于ubuntu22.04-深入浅出 eBPF。这篇文章介绍一个基于ebpf技术的强大工具–bpftrace。 在现代计算机系统中&#xff0c;了解系统的内部运行情况对于诊断问题、优化性能以及进行安全监控至关重要。bpftrace作为一款强大的跟踪…

BUUCTF学习(8): 随便注,SQL

1、介绍 2、解题 1;set sql_modePIPES_AS_CONCAT;select 1 结束

FL Studio 21.1.3750中文完整至尊版2023最新破解版免费下载

FL Studio 21.1.3750中文完整至尊版2023最新破解版免费下载是最好的音乐开发和制作软件也称为水果循环。它是最受欢迎的工作室&#xff0c;因为它包含了一个主要的听觉工作场所。最新fl studio 21中文版 版有不同的功能&#xff0c;如它包含图形和音乐音序器&#xff0c;帮助您…

MT4选网页版还是桌面版?anzo capital昂首资本分析优劣

很多投资者在进行交易的时候&#xff0c;MT4和MT5是必不可少的&#xff0c;但很多投资者会有这样的一个困惑&#xff1f;选网页版还是桌面版呢&#xff1f;下面anzo capital昂首资本就和各位投资者一起了解每个版本的优劣&#xff0c;从而根据自己的实际情况作出选择。 众所周…

适配LVGL界面图片和文字显示很虚,色阶明显的解决方法(全志R128适用)

LVGL界面图片和文字显示很虚&#xff0c;色阶明显的具体问题情况如下图 初步分析为RGB参数问题&#xff0c;先调出Colorbar检查一下 disp -c 0 8 显示如下&#xff0c;无异常 disp -c 0 1 显示如下&#xff0c;有条纹 此时问题可能出现在两个方向 1、rgb接线不稳定有干扰 2、…

巧妙实现重复渐变边框

巧妙实现重复渐变边框 html 结构 <div class"card"><div class"container">在 install 事件中&#xff0c;我们打开了一个名为 my-site-cache-v1的缓存&#xff0c;并将页面资源添加到缓存中。在 fetch事件中&#xff0c;我们首先检查缓存中…

各类证件的版面信息收集

香港身份证的版面分析&#xff1a; 证件页面&#xff1a; 相关的版面信息&#xff1a; 该页面包含香港身份证的信息&#xff0c;可以用于版面分析&#xff1b; 信息来源&#xff1a;香港不同证件说明大汇总|回乡证|居民身份证|护照|永居_手机网易网 台湾通行证号码&#xf…