AcWing 数学知识

news/2024/11/9 3:04:41/

质数

模板:

// 试除法判断质数
bool is_prime(int x)
{if (x < 2) return false;//只需枚举一部分 使得 i<= x / i, 时间复杂度为√nfor (int i = 2; i <= x / i; i ++ )if (x % i == 0)return false;return true;
}// 试除法分解质因数
void divide(int n)
{for (int i = 2; i <= n / i; i++){if (n % i == 0){int cnt = 0;while (n % i == 0){n /= i;cnt++;}printf("%d %d\n", i, cnt);}}//本身就是质数if (n > 1) printf("%d %d\n", n, 1);printf("\n");
}// 

试除法判定质数

在这里插入图片描述
代码:

#include<iostream>
using namespace std;
int n;bool is_prime(int x)
{if (x == 1) return false;for (int i = 2; i <= x / i; i++){if (x % i == 0) return false;}return true;
}int main()
{scanf("%d", &n);while (n--){int a;scanf("%d", &a);printf(is_prime(a) ? "Yes\n" : "No\n");}return 0;
}

分解质因数

在这里插入图片描述
代码:

#include<iostream>
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){n /= i;cnt++;}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;
}

筛质数

在这里插入图片描述
思路:
筛法求质数,有两种方式:

  • 埃氏筛法
  • 线性筛法

埃氏筛法
埃氏筛法每次筛掉质数的倍数(大于等于2倍),这样最后剩下的就全是质数。st[i]st[i]st[i]falsefalsefalse时,表示为质数。
在这里插入图片描述
埃氏筛法代码:

#include<iostream>
using namespace std;const int N = 1000010;
bool st[N];
int primes[N];
int cnt;void get_primes(int n)
{for (int i = 2; i <= n; i++){if (!st[i]) primes[cnt++] = i;for (int j = i + i; j <= n; j += i) st[j] = true;}
}int main()
{int n;cin >> n;get_primes(n);cout << cnt << endl;return 0;
}

线性筛法
线性筛法保证nnn只会被最小质因子筛掉。

  • i % primes[j] == 0primes[j]i的最小质因子,primes[j]primes[j] * i的最小质因子。
  • i % primes[j] != 0primes[j]小于i的最小质因子,primes[j]primes[j] * i的最小质因子。
bool st[N];
int primes[N];
int cnt;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;}}
}

线性筛法代码:

#include<iostream>
using namespace std;const int N = 1000010;
bool st[N];
int primes[N];
int cnt;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 main()
{int n;cin >> n;get_primes(n);cout << cnt << endl;return 0;
}

约数

试除法求约数

在这里插入图片描述
代码:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int n;void get_divisors(int a)
{vector<int> res;for (int i = 1; i <= a / i; i++){if (a % i == 0){res.push_back(i);// 防止平方根多次出现if (i != a / i) res.push_back(a / i);}}//从大到小排序sort(res.begin(), res.end());for (int t : res) printf("%d ", t);printf("\n");}int main()
{scanf("%d", &n);while (n--){int a;scanf("%d", &a);get_divisors(a);}return 0;
}

约数个数

在这里插入图片描述
思路:
给定一个数NNNpip_ipiNNN的质约数,则可以表示为:
N=p1α1×p2α2×p3α3×...×pkαkN=p_{1}^{\alpha_1}\times p_{2}^{\alpha_2} \times p_{3}^{\alpha_3}\times... \times p_{k}^{\alpha_k}N=p1α1×p2α2×p3α3×...×pkαk
NNN的每一个约数did_idi,可以表示为:
di=p1β1×p2β2×p3β3×...×pkβkd_i=p_{1}^{\beta_1}\times p_{2}^{\beta_2} \times p_{3}^{\beta_3}\times... \times p_{k}^{\beta_k}di=p1β1×p2β2×p3β3×...×pkβk
其中,0≤βi≤αi0 \le \beta_i \le \alpha_i0βiαiβi\beta_iβi的选法有0∼αi0 \sim \alpha_i0αi,共有(αi+1)(\alpha_i + 1)(αi+1)种选法 ,根据排列组合原理,约数个数为:
(α1+1)×(α2+1)×(α3+1)×...×(αk+1)(\alpha_1 + 1) \times (\alpha_2 + 1) \times (\alpha_3 + 1) \times ... \times (\alpha_k + 1) (α1+1)×(α2+1)×(α3+1)×...×(αk+1)

依次遍历aia_iai,求aia_iai的质因数以及每个质因数的个数,可以用哈希表保存结果
在这里插入图片描述
代码:

#include<iostream>
#include<unordered_map>
using namespace std;const int mod = 1e9 + 7;int main()
{int n;cin >> n;unordered_map<int, int> primes;while (n--){int x;cin >> x;for (int i = 2; i <= x / i; i++){while (x % i == 0){x /= i;primes[i]++;}}if (x > 1) primes[x]++;}long long res = 1;for (auto prime : primes) res = res * (prime.second + 1) % mod;cout << res << endl;return 0;
}

约数之和

在这里插入图片描述
思路:
根据约数个数的思路,约数之和为d1+d2+d3+...+dk①d_1 + d_2 + d_3 + ... + d_k \: \: \: ①d1+d2+d3+...+dk
其中, di=p1β1×p2β2×p3β3×...×pkβk②d_i=p_{1}^{\beta_1}\times p_{2}^{\beta_2} \times p_{3}^{\beta_3}\times... \times p_{k}^{\beta_k} \: \: \: ②di=p1β1×p2β2×p3β3×...×pkβk
约数之和为(p10+p11+p12...+p1α1)...(pk0+pk1+pk2...+pkαk)(p_1^0+p_1^1+p_1^2...+p_1^{\alpha_1})...(p_k^0+p_k^1+p_k^2...+p_k^{\alpha_k})(p10+p11+p12...+p1α1)...(pk0+pk1+pk2...+pkαk)
展开可得式①,展开的每一项均为did_idi

(pi0+pi1+pi2...+piα1)(p_i^0+p_i^1+p_i^2...+p_i^{\alpha_1})(pi0+pi1+pi2...+piα1)可以按照下面的方式进行推导:
t0=1t_0 = 1t0=1
t1=t0×p+1=p+1t_1 = t_0 \times p + 1 = p + 1t1=t0×p+1=p+1
t2=t1×p+1=p2+p+1t_2 = t_1 \times p + 1 = p^2 + p + 1t2=t1×p+1=p2+p+1

tαi=tαi−1×p+1=pαi+pαi−1+...+p+1t_{\alpha_i }= t_{\alpha_i-1} \times p + 1 = p^{\alpha_i } + p^{\alpha_i-1} +... + p + 1tαi=tαi1×p+1=pαi+pαi1+...+p+1
最后计算∏i=1ntαi\displaystyle\prod _{i=1}^n t_{\alpha_i}i=1ntαi,即为约数之和。
在这里插入图片描述

代码:

#include<iostream>
#include<unordered_map>
using namespace std;const int mod = 1e9 + 7;int main()
{int n;cin >> n;unordered_map<int, int> primes;while (n--){int x;cin >> x;for (int i = 2; i <= x / i; i++){while (x % i == 0){x /= i;primes[i]++;}}if (x > 1) primes[x]++;}long long res = 1;for (auto prime : primes) {long long t = 1;int p = prime.first, a = prime.second;while (a--) t = (t * p + 1) % mod;res = res * t % mod;}cout << res << endl;return 0;
}

最大公因数

在这里插入图片描述
思路:
欧几里得算法,辗转相除法。
代码:

#include<iostream>
using namespace std;int gcd(int m, int n)
{return m % n == 0 ? n : gcd(n, m % n);
}int main()
{int n;cin >> n;while (n--){int a, b;cin >> a >> b;cout << gcd(a, b) << endl;}return 0;
}

http://www.ppmy.cn/news/8981.html

相关文章

戴尔灵越14电脑U盘重装系统方法分享

戴尔灵越14电脑U盘重装系统方法分享。一些用户的戴尔灵越14电脑在进行了系统升级之后&#xff0c;出现了系统不兼容的情况&#xff0c;导致自己的电脑桌面出现了蓝屏的情况。那么这个情况下我们怎么去将系统进行重装呢&#xff1f;一起来看看U盘重装系统的方法吧。 准备工作&am…

Mybatis源码分析(六)Mapper的接口代理

目录一 DefaultSqlSession的解析二 Mapper类动态执行Sql三 SqlCommand的创建过程四 MethodSignature的创建过程五 MapperMethod的execute方法官网&#xff1a;mybatis – MyBatis 3 | 简介 参考书籍&#xff1a;《通用源码阅读指导书&#xff1a;MyBatis源码详解》 易哥 参考文…

buildroot构建hisi平台根文件系统和工具链

buildroot构建hisi平台根文件系统和工具链 前面使用了arm-hisiv300-linux 工具链来作为Buildroot的外部工具链进行编译&#xff0c;然后遇到了很多编译问题。 https://blog.csdn.net/duapple/article/details/128516133?spm1001.2014.3001.5501 这里不使用hisi的工具链&…

前端框架搭建(九)搭建页面布局框架【vite】

1.创建目录 BasicLayout——全局布局 components——布局组件 GlobalContent&#xff1a;全局内容GlobalHeader&#xff1a;全局头部页面 2.处理GlobalHeader 创建HeaderMenu——头部菜单 声明相关类型 在typings目录下创建system.d.ts declare namespace App {/** 全局头…

(一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>

一、工作环境及项目简介 立创EDA&#xff1a;硬件原理图及PCB绘制。 全志F1C200S&#xff1a;F1C100S内置32MB DDR1内存&#xff0c;F1C200S内置64MB DDR1内存。 原理图&#xff1a;参考开源项目&#xff0c;详见墨云&#xff0c; 详见peng-zhihui。 核心板&#xff1a;四层…

【华为OD机试真题2023 JAVA】寻找关键钥匙

华为OD机试真题,2023年度机试题库全覆盖,刷题指南点这里 寻找关键钥匙 知识点字符串编程基础正则表达式排序 时间限制:1s 空间限制:256MB 限定语言:不限 题目描述: 小强正在参加《密室逃生》游戏,当前关卡要求找到符合给定 密码K(升序的不重复小写字母组成)的箱子,并…

BEV视觉3D感知算法梳理

1. 基于BEV空间的自动驾驶感知任务 最近&#xff0c;基于BEV空间下的感知任务已经涌现出了众多优秀算法&#xff0c;并在多个自动驾驶公开数据集&#xff08;KITTI&#xff0c;Waymo&#xff0c;nuScenes&#xff09;上取得了非常不错的成绩。根据自动驾驶汽车上安装的传感器类…

自动驾驶专题介绍 ———— 摄像头

文章目录介绍工作原理实现功能分类按通信协议区分按不同感光芯片按像元排列方式介绍 摄像头可以采集汽车周边的图像信息&#xff0c;跟人类的眼睛最为接近。摄像头可以拥有较广的视场角、较大的分辨率&#xff0c;还可以提供颜色和纹理等信息。这些信息对于实现自动驾驶功能是存…