第四章——数学知识2

news2024/11/18 16:26:56

欧拉函数

欧拉函数表示的是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;
}

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

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

相关文章

TypeScript自学笔记

目录 1.什么是Ts? 1.1 设计公司&#xff1a;微软 1.2 TS概述 1.3 TS是静态类型 JS是动态类型 1.4 TS是强类型语言 JS是弱类型语言 2.TypeScript编译器 2.1 安装 2.2 TS自动编译和编译选项设置 3.TS的数据类型 3.1 基础数据类型number、string、boolean 3.2 Arrays&a…

大数据架构(二)大数据发展史

1.传统数仓发展史 传统数据仓库的发展史这里不展开架构细讲&#xff0c;只需快速过一遍即可。了解这个历史发展过程即可。 1.1 传统数仓历史 1.1.1 5个时代 传统数仓发展史可以称为5个时代的经典论证战。按照两位数据仓库大师 Ralph kilmball、Bill Innmon 在数据仓库建设理念上…

吃透Redis面试八股文

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

Python Review 01

1、Anaconda Installation 使用Anaconda Navigator进行python环境管理&#xff0c;使用conda进行依赖管理。 2、Use of Jupyter 将代码写入一个个cell&#xff0c;代码文件由一个个cell组成&#xff0c;书写代码时就像一行一行在写笔记&#xff0c;这就是notebook的代码编辑环…

无宿主机权限情况下,获取pod的日志文件

如果没有宿主机权限,是无法访问宿主机及里边的文件的,但是如果想获取某些文件,如日志等如何操作呢? 整体思路:通过抓包工具,抓取websocket的的信息,然后把信息处理拼接后导出即可。 1、启动抓包工具 我这里使用的是charles抓包工具 2、打开对应pod的命令行窗口 3、抓…

基于灰度图像和小波图的双模态卷积神经网络在心血管疾病分类中的应用

目录 一、研究对象和ECG记录预处理 二、机器学习和LSTM 三、将一维ECG记录转换为二维图像 四、双模态CNN模型 五、性能评估 参考文献 一、研究对象和ECG记录预处理 本研究采用Chapman大学和Shaoxing人民医院&#xff08;浙江大学医学院绍兴医院&#xff09;收集的12导联…

领导力专题︱如何培养与提升领导力

本文内容结构 一、领导力的核心技能 1、完美领导者&#xff1f; 2、认识你的组织需要什么 3、不同层面领导力共有的特征和技能 4、你的个人行为准则 5、领导风格 6、创造个人影响力 7、完善自己的领导网络 二、领导力与领导者 1、领导力与组织环境 2、领导者还是管理…

2023/4/23总结

项目&#xff1a; 做出了个人信息界面&#xff0c;通过点击头像的方式&#xff1a; 然后就是点击头像可以选择文件&#xff08;后面考虑是存储该文件到自己的文件夹还是只是加载该文件比较好&#xff09;只是能选择文件&#xff0c;写了指定文件后缀名的代码但是好像没什么用…

如何将Edge插件迁移至Google?

问题描述&#xff1a; 因为无法访问谷歌&#xff0c;无法从谷歌插件市场下载插件 第一步&#xff1a;在电脑上找到插件地址 高亮部分&#xff1a;自己电脑上的用户名【不同用户可能会有所不同】 C:\Users\star-dream\AppData\Local\Microsoft\Edge\User Data\Default\Extensi…

rust的现状和未来发展

rust现状: Stack Overflow 的开发者调研显示只有 7% 的开发者在使用 Rust&#xff0c;对比 JavaScript、Python 等语言&#xff0c;使用 Rust 的开发者占比并不高&#xff1b;但从 2016 年开始&#xff0c;Rust 每年都是开发者最爱的编程语言。 根据 JetBrains 2021 年的调研报…

SSH远程访问及控制

文章目录 1.SSH远程管理1.1 SSH的概述1.2 OpenSSH服务器1.3 sshd_ config常用选项设置1.4 SSH端口、配置文件 2.配置OpenSSH服务端2.1 更改端口号2.2 用户登录控制 3.登录验证方式3.1 密码验证3.2 密钥对验证3.3 配置密钥对验证 5.TCP Wrappers访问控制5.1 TCPWrappers机制的基…

第37讲:Python if-elif-else流程控制语句核心概念以及案例演示

文章目录 1.流程控制的概念2.Python中代码块的相关注意事项3.if流程控制语句的语法格式4.if流程控制的简单使用4.1.单分支的if流程控制语句4.2.加else语句的if流程控制4.3.多分支的if流程控制4.4.多分支if代码优化 5.对象的布尔值6.if-else条件表达式6.1.if-else条件表达式语法…

String的那些事儿

String作为我们最常用的Java类之一&#xff0c;在日常开发过程中充当着重要角色&#xff1f;那么大家真的了解String吗&#xff1f;让我们一起看看下面的问题&#xff1a; String内存结构&#xff1f;对象存储在堆上还是栈上&#xff1f;一个String有多长&#xff1f;占内存多…

享元设计模式解读

目录 问题引进 展示网站项目需求 传统方案解决网站展现项目 传统方案解决网站展现项目-问题分析 享元模式基本介绍 基本介绍 享元模式的原理类图 对类图的说明 内部状态和外部状态 享元模式解决网站展现项目 应用实例要求 思路分析和图解(类图) 代码实现 享元模式…

创建一个 vue 3 项目

vue create projectNameVue CLI v5.0.8 ? Please pick a preset: ❯ Default ([Vue 3] babel, eslint)Default ([Vue 2] babel, eslint)Manually select featuresbabel : ES2015 and beyond。Babel 默认使用一组 ES2015 语法转换器&#xff0c;允许你使用新的语法&#xff0c…

vue2数据响应式原理(6) 处理数组特殊遍历

打开一直在写的案例 然后 找到src下的 dataResp.js 这里 我们Observer中 数数组和对象还是要分开处理 因为他们还是有所不同 我们修改 Observer 类代码如下 class Observer{constructor(value) {//相当于 给拿到的对象 其中的__ob__绑定 值为thsi,在类中用this 表示取实例本…

数据结构入门(C语言版)一篇文章教会你手撕八大排序

八大排序 排序的概念常见的排序算法排序算法的实现一、直接插入排序二、希尔排序三、选择排序四、堆排序五、冒泡排序六、快速排序1.递归写法①三位取中函数②hoare版本③挖坑法④前后指针版本⑥快排主函数 2.非递归写法 七、归并排序1.递归写法2.非递归写法 八、非比较排序1.基…

倾斜摄影三维模型顶层合并技术及其实现方法

倾斜摄影三维模型顶层合并技术及其实现方法 倾斜摄影三维模型由于数据量大、结构复杂&#xff0c;常常需要进行顶层合并&#xff0c;以便更好地应用到城市规划、土地管理和文化遗产保护等领域。本文将介绍倾斜摄影三维模型顶层合并技术及其实现方法。 1、什么是顶层合并 倾斜…

【安全与风险】普适计算中的安全与隐私研究

普适计算中的安全与隐私研究 日常生活的数字化无处不在的计算对移动社交媒体的影响讨论更便宜的存储和更强大的处理的影响移动和普适计算的影响有时候&#xff0c;惊奇另一个例子攻击模型贡献是什么&#xff1f;智能家居的案例研究本文的主要内容如何自学? 日常生活的数字化 …

第三章 使用 Maven:命令行环境

第一节 实验一&#xff1a;根据坐标创建 Maven 工程 Maven 核心概念&#xff1a;坐标 ①数学中的坐标 使用 x、y、z 三个**『向量』作为空间的坐标系&#xff0c;可以在『空间』中唯一的定位到一个『点』**。 ②Maven中的坐标 [1]向量说明 使用三个**『向量』在『Maven的仓…