第四章——数学知识2

欧拉函数

欧拉函数表示的是1-n中与n互质数的个数。

如1-6中:1,5都和6互质,因此互质数为2

欧拉函数分解质因数后表示为:

互质数个数可表示为

int main()
{
    int n;
    cin >> n;
    while(n--)
    {
        int a;
        cin >> a;
        //分解质因数
        int res = a;
        for (int i = 2; i <= a / i; ++i)
        {
            if (a % i == 0)//如果a能整除i,说明i是质因子
            {
                //i是a的质因子
                res = res / i * (i- 1);// res* (1 - 1 / a);这俩式子等价
                while (a % i == 0)//把i除干净
                {
                    a /= i;
                }
            }
        }
        if (a > 1)//a有一个大的质因子
            res = res / a * (a-1);
        cout << res << endl;
    }
    return 0;
}

筛法求欧拉函数

如果求1-n的每个欧拉函数上面的方法就比较复杂,我们用筛法求欧拉函数比较简单。

如果一个数为n,而且该数是质数,则从1到n-1所有的数都与它互质,即有n-1个数跟它互质。

给这个公式乘i,即α (pj,i)比α(i)多了一项pj ,即分解质因数后多乘了一个pj

乘j之后欧拉函数是这样,即α (pj,i)=pj*α(i)

当i%pj不等于0时

const int N = 1000010;
int n;
int primes[N];//存每一个质数
int cnt;//质数的下标
bool st[N];//每个数是否被筛掉 
int phi[N];//存储欧拉函数
typedef long long LL;
LL get_eulers(int n)
{
    phi[1] = 1;
    //线性筛法
    for (int i = 2; i <= n ; ++i)
    {
        if (!st[i])//如果当前数没有被筛过,就说明当前是质数
        {
            primes[cnt++] = i;
            phi[i] = i - 1;//有i-1个数跟它互质
        }
        for (int j = 0; primes[j] <= n / i; j++)//从小到大枚举所有的质数
        {
            st[primes[j] * i] = true;
            if (i % primes[j] == 0)//如果当前数模primes[j]为0
            {
                phi[primes[j] * i] =  phi[i]* primes[j];//α (pj,i)=pj*α(i)
            
                break;
            }
            phi[primes[j] *i] = phi[i] * (primes[j] - 1);
        }
    }
    LL res = 0;
    for (int i = 1; i <=n ; ++i)
    {
        res += phi[i];
    }
    return res;
}
int main()
{
    int n;
    cin >> n;
    cout<<get_eulers(n)<<endl;
    return 0;
}

三条横线是余数

快速幂

快速的求出来a的k次方模p的结果。

快速幂预处理出这些值

目标就是把k拆成下面这种形式

把K化成二进制,二进制表示里面所有是1的位,都写成2的多少次方即可。

小结

即每一个数是上一个数的平方。

看下面这个例子

先预处理出4的2的0次方到4的2的2次方

4的2的0次方是4

4的2的1次方是4的平方模10=6

4的2的2次方是上面结果6的平方模10,结果还是6

之后把4的5次方中的5拆成2进制形式

由于这里范围是10的9次方,有乘积int会报错,所以我们用long long

typedef long long LL;
//求a的k次方模p
int qmi(int a, int k, int p)
{
    //若有4的5次方模10,这里的a相当于4,5相当于k只不过k要用二进制形式,p就是10
    int res = 1;
    while (k)
    {
        //这里要用k的二进制
        if (k & 1) //判断二进制下,最后以为是不是1
            res = (LL)res * a % p;
        //第一项是a的2的0次方,其实就是a自己
        /*先求4的2的0次方是4
          再求4的2的1次方是4的平方模10 = 6
          再求4的2的2次方是上面结果6的平方模10,结果还是6*/
        k >>= 1;
        a = (LL)a * a % p;//让a变为下一个,a的2的0次方,下一个就是a的2的一次方
        /* 4的2的0次方,下一个就是4的2的1次方
        * 4的2的1次方用完之后,变成4的2的2次方
        */ 
    }
    return res;
}
int main()
{
    int n;
    scanf("%d", &n);
    while (n--)
    {
        int a, k, p;
        scanf("%d %d %d", &a, &k, &p);
        printf("%d\n", qmi(a, k, p));//a的k次方模p
    }
    return 0;
}

快速幂求逆元

逆元的性质:

同余式
设有正整数m,a,b。若满足m|(a-b),即m能被(a-b)整除,则称a与b对m同余。记为:
a ≡ b (mod p) ,也可以记为 a = b + kp
费马小定理
如果p是一个质数,而整数a不是p的倍数,则有a^(p-1) ≡ 1 (mod p)
乘法逆元的定义(太长不看)
若整数 b,m 互质,并且对于任意的整数 a,如果满足 b|a,则存在一个整数 x,使得 a/b≡a × x (mod m),则称 x 为 b 的模 m 乘法逆元,记为 b^−1 (mod m)。
b 存在乘法逆元的充要条件是 b 与模数 m 互质。当模数 m 为质数时,b^(m−2) 即为 b 的乘法逆元。
(看这里)简而言之:
找到一个x,使得b × x ≡ 1 (mod m),这个x,则称 x 为 b 的模 m 的乘法逆元。

因此,求逆元就等同于求b的p-2次方模上m的结果,即快速幂。

typedef long long LL;
//求a的k次方模p
int qmi(int a, int k, int p)
{
    //若有4的5次方模10,这里的a相当于4,5相当于k只不过k要用二进制形式,p就是10
    int res = 1;
    while (k)
    {
        //这里要用k的二进制
        if (k & 1) //判断二进制下,最后以为是不是1
            res = (LL)res * a % p;
        //第一项是a的2的0次方,其实就是a自己
        /*先求4的2的0次方是4
          再求4的2的1次方是4的平方模10 = 6
          再求4的2的2次方是上面结果6的平方模10,结果还是6*/
        k >>= 1;
        a = (LL)a * a % p;//让a变为下一个,a的2的0次方,下一个就是a的2的一次方
        /* 4的2的0次方,下一个就是4的2的1次方
        * 4的2的1次方用完之后,变成4的2的2次方
        */
    }
    return res;
}
int main()
{
    int n;
    scanf("%d", &n);
    while (n--)
    {
        int a,  p;
        scanf("%d %d", &a, &p);
        int res = qmi(a, p - 2, p);
        if (a%p)
            printf("%d\n", res);//a的k次方模p
        else puts("impossible");
    }
    return 0;
}

扩展欧几里得算法

裴蜀定理:有一对正整数a,b,一定存在非0整数x,y使得ax+by=(a,b)括号表示a和b的最大公约数,即ax+by=d,d一定是a,b的最大公约数的倍数。

当b为0时

int exgcd(int a, int b, int& x, int& y)
{
    if (!b)
        {
            x=1,y=0;
            return a;
        }
    int d=exgcd(b, a % b,y,x);//注意这里x和y传参要翻转一下
    y -= a / b * x;
    return d;
}
int main()
{
    int n;
    scanf("%d", &n);
    while (n--)
    {
        int a, b,x,y;
        scanf("%d %d", &a, &b);
        exgcd(a, b, x, y);//扩展欧几里得
        printf("%d %d\n", x, y);
    }
    return 0;
}

线性同余方程

使得(a*x)/m余数是b

第一个无解,第二个答案2,7都可以

最顶部的方程有解,等价于最下面的等式有解,而这个等式有解的充分必要条件是,b必须整除a,m的最大公约数。

有解的重复必要条件

用扩展欧几里得算法求出x和y'算出d,d是最大公约数。

typedef long long LL;
int exgcd(int a, int b, int& x, int& y)
{
    if (!b)
        {
            x=1,y=0;
            return a;
        }
    int d=exgcd(b, a % b,y,x);//注意这里x和y传参要翻转一下
    y -= a / b * x;
    return d;
}
int main()
{
    int n;
    scanf("%d", &n);
    while (n--)
    {
        int a, b,m;
        scanf("%d %d %d", &a, &b,&m);
        int x, y;
        int d=exgcd(a, m, x,y);//扩展欧几里得
        if (b % d) puts("impossible");//如果b不是d的倍数,一定无解
        else printf("%d\n", (LL)x * (b / d) % m);
    }
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring Bean的作用域及生命周期

目录 前言&#xff1a; Bean的作用域&#xff08;Scope&#xff09; 单例模式 原型模式&#xff08;多例作用域&#xff09; 请求作用域&#xff08;request&#xff09; 会话作用域 全局作用域 网络长连接 Spring执行流程 Bean的生命周期 测试 小结&#xff1a; 前…

面试redis之两大金刚,你懂吗

前言 Redis持久化&#xff0c;一个老掉牙的问题&#xff0c;但是面试官就是喜欢问。这也是我们学Redis必会的一个知识点。Redis作为内存数据库&#xff0c;它工作时&#xff0c;数据都保存在内存里&#xff0c;这也是它为什么很快的一个原因。但存到内存里肯定是有丢数据的风险…

易基因:ChIP-seq等揭示热休克转录因子A1b调控植物高温胁迫响应的分子机制|应激反应

在拟南芥中&#xff0c;热休克转录因子A1b&#xff08;HEAT SHOCK TRANSCRIPTION FACTORA1b&#xff0c;HSFA1b&#xff09;通过影响种子产量来调控对环境胁迫的抗性。HSFA1b是生殖适应性的决定性因素&#xff0c;这种调控机制怎么形成的呢&#xff1f; 2018年&#xff0c;英国…

【微电网_储能】基于启发式状态机策略和线性程序策略优化方法的微电网中的储能研究【给定系统约束和定价的情况下】(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

前端项目代码规范

一、变量与函数的命名&#xff08;变量名和函数名是最好的注释&#xff09; 通常情况下函数小陀峰、类名大陀峰、变量短横线/小陀峰、const全大写单词要表达出正确的语义&#xff0c;如&#xff1a;array类型或其它集合类型用英语复数格式、其它类型不要用复数格式区分函数为功…

【服务器】Linux搭建我的世界服务器 + 公网远程联机教程

Yan-英杰的主页 悟已往之不谏 知来者之可追 C程序员&#xff0c;2024届电子信息研究生 目录 前言 1. 安装JAVA 2. MCSManager安装 3.局域网访问MCSM 4.创建我的世界服务器 5.局域网联机测试 6.安装cpolar内网穿透 7. 配置公网访问地址 8.远程联机测试 9. 配置固定…

C++ 线程

linux使用线程 在linux使用线程可能出现&#xff0c;在编译时不会报错&#xff0c;但执行出错的问题。 undefined reference to pthread_create这是由于ubuntu平台下调用pthread_create()函数&#xff0c;pthread 库不是 Linux 系统默认的库&#xff0c;连接时需要使用静态库 …

MII、 RMII、 GMII、 RGMII 接口介绍

1、RGMII 接口概要 以太网的通信离不开物理层 PHY 芯片的支持&#xff0c;以太网 MAC 和 PHY 之间有一个接口&#xff0c;常用的接口有MII、 RMII、 GMII、 RGMII 等。 MII&#xff08;Medium Independent Interface&#xff0c; 媒体独立接口&#xff09;&#xff1a; MII 支持…

RabbitMQ之介绍以及安装

1.1 MQ的相关概念 1.1.1 什么是MQ ​ MQ&#xff0c;从字面意思上看&#xff0c;本质是个队列&#xff0c;FIFO先入先出&#xff0c;只不过队列中存放的内容是message而已&#xff0c;还是一种跨进程的通信机制&#xff0c;用于上下游传递消息。在互联网架构中&#xff0c;MQ…

移远通信笔试题

限时60分钟 1.下列关于栈叙述正确的是 A A) 栈顶元素最先能被删除 B&#xff09;栈顶元素最后才能被删除 C&#xff09;栈底元素永远不能被删除 D&#xff09;以上三种都不对 在栈中&#xff0c;最后被压入的元素总是在栈顶上方&#xff0c;而栈顶元素总是最先被弹出的元…

理解龙格库塔法基本C程序

先学习龙格-库塔法&#xff1b; 龙格-库塔&#xff0c;Runge-Kutta&#xff0c;该方法用于数值求解微分方程&#xff1b; 其中包括著名的欧拉法&#xff1b; 经典四阶法 该方法主要是在已知方程导数和初值信息&#xff0c;利用计算机仿真时应用&#xff0c;省去求解微分方…

人工智能之配置环境教程一:安装VsCode和Anaconda

人工智能之配置环境教程一&#xff1a;安装VsCode和Anaconda 作者介绍一&#xff0e; 安装VScode编辑器二. 安装Anaconda 作者介绍 孟莉苹&#xff0c;女&#xff0c;西安工程大学电子信息学院&#xff0c;2021级硕士研究生&#xff0c;张宏伟人工智能课题组。 研究方向&#…

shell脚本----条件判断语句

文章目录 一、条件测试1.1 文件测试和整数测试文件测试整数值比较 1.2字符串测试和逻辑测试字符串测试&#xff1a;逻辑测试 二、if语句三、case语句 一、条件测试 1.1 文件测试和整数测试 文件测试 test命令 测试表达是是否成立&#xff0c;若成立则返回0&#xff0c;否则返…

元宇宙的应用领域

应用领域一&#xff1a;游戏 1.游戏是最先成长起来的元宇宙场景。虚拟社交身份、开放性、经济系统、沉浸感、世界可持续性是元宇宙游戏需关注的五大特征。 2.元宇宙游戏依然是游戏&#xff0c;现阶段参与元宇宙游戏的主要是游戏爱好者。新的概念依旧需要好的游戏产品支撑。团…

malloc的一些知识

这是一个叫malloc的家伙&#xff0c;一直勤勤恳恳帮你为所欲为的玩转系统内存。可是长路漫漫&#xff0c;唯malloc作伴&#xff0c;我却不懂它。走近malloc&#xff0c;多了解一下总没错。 可能对我们来讲&#xff0c;malloc就是void* malloc (size_t len)&#xff0c;调用就是…

4月24日作业

作业1 #include <iostream> using namespace std; template <typename T> class Node { private: T* p; //指针指向栈的首地址 int maxsize; //栈最大容量 int top-1; //栈顶 public: Node(){} //无参构造 Node(int max):maxsize(max)//有参构造 填最大容…

JavaScript 知识总结下篇(更新版)

91.实现一个 promise 参考链接&#xff1a;实现一个完美符合Promise/A规范的Promise Issue #4 forthealllight/blog GitHub function myPromise(constructor) {let self this;self.status "pending" // 定义状态改变前的初始状态self.value undefined;// 定义状…

基于html+css的图片展示32

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

STM32WB55_NUCLEO开发(11)----发送数据到手机

概述 本篇文章将详细介绍如何在上节配置的基础上&#xff0c;实现通过点击STM32WB开发板上的按键发送数据到手机上。 硬件准备 首先需要准备一个开发板&#xff0c;这里我准备的是NUCLEO-WB55RG 的开发板&#xff1a; 蓝牙配置 选择“mySVC”选项卡。添加第二个特征&…

有始有终的编码原则

基本情况 在程序员的修炼之道之中&#xff0c;说到&#xff1a; 这个建议能简单地应用到大多数场合。简单说就是&#xff0c;分配资源的函 数或对象&#xff0c;对释放资源应负有责任。 这其实就是我们常说的谁分配的就谁负责释放&#xff0c;这也是内存释放的一个原则&#x…