2022.6.2 质数(素数)与合数
一、定义:
1、质数():如果p除了显然约数(1 和 p)外没有其他约数,那么称p为素数(不可约数)。
2.合数():a不是素数,则称a为合数。
二、性质:
1、如果a为合数,则必可以拆分为a=b*c()。
2、如果质数p有大于1的因数d,则p一定等于d。
3、大于1的合数a一定可以拆分为多个质数的乘积。
4、大于1的合数a必有质数p导致批 p | a()。
5、质数有无穷多个。
6、大于4的质数都可以分解成的形式。
证明:
一个数k(大于3)%6可能会有余数:0,1,2,3,4,5
余数0,2,4 则k必为偶数
余数为3 3+6n=3+3*2n=3*(2n+1),为合数
只剩余数1,5 为 6n+1 和 6n-1
三、质数计数函数:
表示小于或等于n的素数的个数。
四、质数判定:
1、暴力枚举:
bool isPrime(int n){if(n<2)return false;for(int i=2;i<n;i++){if(n%i==0)return false;}return true;
}
时间复杂度O(n),容易超时。
2、对半测试:
一个数的最小非1的因数为2,所以这个数最大的因数会小于等于n/2。
bool isPrime(int n){if(n<2)return false;for(int i=2;i<=n/2;i++){if(n%i==0)return false;}return true;
}
3、简单检测:
这样做是十分稳妥了,但不一定所有数都要判断。
很容易发现这样一个事实:如果a是n的约数,那么也是n的约数。
这个结论告诉我们,对于每一对 ,只需要检验其中的一个就好了。为了方便起见,我们之考察每一对里面小的那个数。不难发现,所有这些较小数就是这个区间里的数。
由于1肯定是约数,所以不检验它。
bool isPrime(int n){if(n<2)return false;for(int i=2;i*i<=n;i++){if(n%i==0)return false;}return true;
}
五、筛数:
1、埃氏筛)
不是质数的数不筛 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|
2 | \ | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 |
3 | \ | \ | 0 | 0 | 1 | 0 | 0 | 1 | 0 |
4 | \ | \ | \ | \ | \ | \ | \ | \ | \ |
5 | \ | \ | \ | \ | 0 | 0 | 0 | 0 | 1 |
6 | \ | \ | \ | \ | \ | \ | \ | \ | \ |
7 | \ | \ | \ | \ | \ | \ | 0 | 0 | 0 |
8 | \ | \ | \ | \ | \ | \ | \ | \ | \ |
9 | \ | \ | \ | \ | \ | \ | \ | \ | \ |
结果 | 质数 | 质数 | 合数 | 质数 | 合数 | 质数 | 合数 | 合数 | 合数 |
先用2去筛,即把2留下,把2的倍数剔除掉
再用下一个质数,也就是3筛,把3留下,把3的倍数剔除掉;
接下去用下一个质数5筛,把5留下,把5的倍数剔除掉;
不断重复下去…
void ass(int n){bool vis[n+1];int prime[n+1],len=0;for(int i=2;i<=n;i++){if(!vis[i]){prime[++len]=i;for(int j=2;i*j<=n;j++){vis[i*j]=1;}}}
}
2、欧拉筛:
在埃氏筛的运算中,10被算了两次,特别浪费。
void ols(int n){int a[n+1],b[n+1];for(int i=2;i<=n;i++){if(a[i]==0){b[++k]=i;}for(int j=1;i*j<=n;j++){if(i*b[j]>n)break;a[i*b[j]]=1;if(i%b[j]==0)break;} }
}
六、真题演练:洛谷(P2441 角色属性树)
题目描述:
绪萌同人社是一个有趣的组织,该组织结构是一个树形结构。有一个社长,直接下属一些副社长。每个副社长又直接下属一些部长……。
每个成员都有一个萌点的属性,萌点属性是由一些质数的萌元素乘积构成(例如,猫耳的值是2,弱气的值是3,黄毛的值是5,病娇的值是7,双马尾的值是11等等)
举个例子,正妹是双份的猫耳,而且有一份弱气,她的属性值为2*2*3=12。
现在组员关心一个问题,希望知道离自己最近且有相同萌元素上司是谁,例如,属性值为2、4、6、45这样的属性值都算是和正妹有相同的属性。
然而,组员可能会随时变化自己的属性。啊。。感觉好麻烦啊。。
输入格式:
第一行,n,k 表示成员数与询问的次数
第二行,n个数,分别是1~n号成员的属性值
接下来n-1行,x_i,y_i 表示x_i是y_i的上司。
接下来来k行,有两种情况
1 u_i 询问离u_i成员最近且有相同萌元素上司。
2 u_i a 更改u_i的属性值为a
输出格式:
对于每个1类型的询问,输出符合要求的编号。如果没有符合要求的编号,输出-1。
输入样例:
4 6
10 8 4 3
1 2
2 3
3 4
1 1
1 2
1 3
1 4
2 1 9
1 4
输出样例:
-1
1
2
-1
1
说明提示:
对于20%的数据,没有修改的操作。
对于50%的数据,n<=100,修改次数<10
对于100%的数据,n<=200000,k<100000 ,修改次数<=50,a_i<=2^31-1
UPD:本题测试数据随机,可能是假题。
思路:
使用vector建一棵树,记录上司是谁。再用暴力dfs搜索。
实现:
#include <iostream>
#include <algorithm>
#include <iomanip>
#include <cstring>
#include <fstream>
#include <sstream>
#include <vector>
#include <string>
#include <cstdio>
#include <cmath>
#include <deque>
#include <queue>
#include <stack>
#include <list>
#include <map>
using namespace std;
const int N = 2e5 + 10;
const int INF = 0x3f3f3f3f;
int n,k,a[N],x,y,op;
vector<int>v[N];
int gcd(int a,int b){if(a<b){swap(a,b);}if(a%b==0)return b;if(a==1||b==1)return 1;return gcd(b,a%b);
}
int dfs(int u,int pos){int len=v[u].size();if(len<1){return -1;}else{for(int i=0;i<len;i++){if(gcd(a[v[u][i]],a[pos])>1){return v[u][i];}}for(int i=0;i<len;i++){return dfs(v[u][i],pos);}}
}
int main(){cin >>n>>k;for(int i=1;i<=n;i++){cin >>a[i];}for(int i=1;i<=n-1;i++){cin >>x>>y;v[y].push_back(x);}for(int i=1;i<=k;i++){cin >>op;if(op==1){cin >>x;cout <<dfs(x,x)<<endl;}else{cin >>x>>y;a[x]=y;}}return 0;
}
2022.6.2 质数(素数)与合数相关推荐
- Java 洛谷 求质数(素数)、合数、因数、最大公约数、最小公倍数
什么是因数? "因数是指整数a除以整数b(b≠0) 的商正好是整数而没有余数,我们就说b是a的因数.而小学数学定义 :假如a*b=c(a.b.c都是整数),那么我们称a和b就是c的因数.&q ...
- 素数(质数)与合数的研究
不是所有的质数都被隔开,2 和 3 就是相邻的: 对一个质数做因子分解时,只有 1 和本身.因此将质数个小球,或其他什么物品,排列成几行几列的形式,是做不到的. 1. 筛选法:不超过 NN 的一切素数 ...
- 素数(质数),合数 ,偶数 , 奇数 ,约数(因数) ,因子 , 质因子 , 哥德巴赫猜想定义
约数(因数):如果整数a除以整数b(b≠0) 除得的商正好是整数而没有余数,我们就说a能被b整除,或b能整除a.a称为b的倍数,b称为a的约数.例如4 的约数(因数) 有 1 , 2 , 4 : 因子 ...
- Java分解质因数(每个非素数(合数)都写成几个素数(也可称为质数)相乘的形式)
分解质因数(5分) 题目内容: 每个非素数(合数)都可以写成几个素数(也可称为质数)相乘的形式,这几个素数就都叫做这个合数的质因数.比如,6可以被分解为2x3,而24可以被分解为2x2x2x3. 现在 ...
- python质数判断if isprime_使用Python判断质数(素数)的简单
这篇文章主要介绍了使用Python判断质数(素数)的简单方法讲解,经常被用来做科学计算的Python处理这种小问题当然手到擒来^_-需要的朋友可以参考下 质数又称素数.指在一个大于1的自然数中,除了1 ...
- python判断素数的函数_使用Python判断质数(素数)的简单方法讲解
质数又称素数.指在一个大于1的自然数中,除了1和此整数自身外,不能被其他自然数整除的数.素数在数论中有着很重要的地位.比1大但不是素数的数称为合数.1和0既非素数也非合数.质数是与合数相对立的两个概念 ...
- 第十四届蓝桥杯集训——for——判断质数/素数
第十四届蓝桥杯集训--for--判断质数/素数 目录 第十四届蓝桥杯集训--for--判断质数/素数 1.什么是质数/素数? 2.整除代码的表达方式? 3.判断素数代码 4.素数的价值 5.素数分布规 ...
- python 素数库_使用Python判断质数(素数)的简单方法讲解
质数又称素数.指在一个大于1的自然数中,除了1和此整数自身外,不能被其他自然数整除的数.素数在数论中有着很重要的地位.比1大但不是素数的数称为合数.1和0既非素数也非合数.质数是与合数相对立的两个概念 ...
- 判断 一个数 是不是 质数 / 素数
判断 一个数 是不是 质数 / 素数 [面试必备 100题 系列 ]- 001 - 判断 一个数 是不是 质数 / 素数 一.命题分析: 质数 又称 素数.指整数在一个大于1的 自然数 中,除了1和此 ...
- 用php输出一百以内的素数,php输出1000以内质数(素数)示例
php输出1000以内质数(素数)示例 复制代码 代码如下: for($i = 2; $i < 1001; $i++) { $primes = 0; for($k = 1; $k <= $ ...
最新文章
- COM笔记-CoCreateInstance
- java抽象类与接口区别6_java基础知识(6)---抽象类与接口
- App设计灵感之十二组精美的手机闹钟App设计案例
- 前端学习(1728):前端系列javascript之状态栏分析
- 当S8遇上边缘计算:谈阿里云ENS对直播业务场景的支撑
- jmeter-5.3 测试http接口动态数据 windows+Linux双环境
- excel设置默认值_职场办公必备的7个Excel应用技巧解读,易学易懂,收藏备用!...
- POJ-2480 Longge's problem 欧拉函数
- Discuz3.2开启图片列表显示教程
- 经典机器学习系列(八)【支持向量机】
- 教学思路SQL之入门习题《学员成绩》 二、基础单表查询
- 喵喵玩 v3.8.5
- _stdcall和_cdecl
- 计算机专业考研北京有哪些学校,计算机考研北京地区学校大全!
- js和css压缩工具
- 《白帽子讲Web安全 》 随手记(一)
- 使用Python对excel中的数据进行处理
- docker desktop 运行mysql
- HTML三种引入样式的方式
- android程序设计魔方矩阵,【图片】【记录】零基础用c4droid写一个3D魔方软件_c4droid吧_百度贴吧...
热门文章
- java代码开发类似知网导出_知网语义相似度计算java实现 - 源码下载|其它|中文信息处理|源代码 - 源码中国...
- vue三级路由router-view不显示问题,路由嵌套不显示
- 佛祖保佑永无BUG python版本
- 5G SCMA MPA算法
- python吃内存吗_python – 为什么泡菜吃内存?
- Neo4j导入本地CSV文件三元组关系生成图谱
- 利用python编写爬虫程序,从招聘网站上爬取数据,将数据存入到MongoDB数据库中,将存入的数据作一定的数据清洗后做数据分析,最后将分析的结果做数据可视化
- pg_rewind详解
- 如何在Windows10下安装ubuntu双系统(无U盘)
- 计算机右下角时间格式,电脑右下角时间格式_电脑右下角时间不准