牛客——都别吵吵了,我才是签到(质因数分解和统计质因数次数)

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

题目描述

陶陶刚上一年级,今天数学课上老师教了乘法和除法,老师留了一道课后习题,陶陶很快地写完了,现在想请你帮助他检查一下是否和答案一致。

初始值为 111,给定两个操作序列,判断操作结果是否相同。

 

这道题如果直接模拟的话肯定是不能过全部示例的,会爆int。

#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>

using namespace std;

vector<int> factorize(int n) {
    vector<int> factors;
    for (int i = 2; i * i <= n; ++i) {
        while (n % i == 0) {
            factors.push_back(i);
            n /= i;
        }
    }
    if (n > 1) {
        factors.push_back(n);
    }
    return factors;
}

void solve() {
    int q, cnt1 = 0, cnt2 = 0;
    cin >> q;
    vector<int> mp1(200005), mp2(200005);

    while (q--) {
        int op, x;
        cin >> op >> x;
        cnt1 += (x < 0 ? 1 : 0);
        vector<int> a = factorize(abs(x));
        if (op == 1) {
            for (auto ai : a) {
                mp1[ai]++;
            }
        } else {
            for (auto ai : a) {
                mp1[ai]--;
            }
        }
    }

    cin >> q;
    while (q--) {
        int op, x;
        cin >> op >> x;
        cnt2 += (x < 0 ? 1 : 0);
        vector<int> a = factorize(abs(x));
        if (op == 1) {
            for (auto ai : a) {
                mp2[ai]++;
            }
        } else {
            for (auto ai : a) {
                mp2[ai]--;
            }
        }
    }

    cout << (mp1 == mp2 && cnt1 % 2 == cnt2 % 2 ? "YES" : "NO");
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr), cout.tie(nullptr);

    int _ = 1;
    //cin >> _;

    while (_--) {
        solve();
    }

    return 0;
}

这段代码使用了质因数分解和统计质因数出现次数的方法来判断两个操作序列是否相同。

在 factorize 函数中,通过遍历从 2 开始到根号 n 的所有数,将能整除 n 的数作为质因数,并将其存储在一个向量中。如果 n 仍然大于 1,表示 n 自身就是一个质因数,将其加入向量。最后返回质因数向量。

在主函数 solve 中,通过对每个操作进行因式分解,将质因数的出现次数记录在 mp1 和 mp2 中。然后通过比较两个 mp 向量是否相等,以及比较 cnt1 和 cnt2 的奇偶性是否相同来判断两个操作序列是否相同。

这种方法的核心思想是利用质因数分解将一个数拆分成质因数的乘积,然后通过比较质因数的出现次数来判断两个数是否相同。请注意,这种方法只能判断两个操作序列是否相同,而不能得到具体的操作步骤。

补充:

分解质因数模板:

#include <iostream>
using namespace std;

int main ()
{
	int n,i=2;
	cin>>n;
	cout<<n<<"=";
	do {
		while(n%i==0) {
			cout<<i;
			n=n/i;
			if(n!=1) cout<<"*";
		}
		i++;
	}
	while(n!=1);
    return 0;
}

素数判定:

1.

循环,将n除以2---n-1的整数,如果有其中一个数运算后的余数==0,n不为素数。

#include<iostream>
using namespace std;
int main()
{
	int n;
	cin>>n;
	bool flag=1;
	for(int i=2;i<n;i++){
		if(n%i==0){
			flag=0;
			break;
		}
	}
	if(flag)cout<<"YES";
	else cout<<"NO";
	return 0;
}

2.素数的因子只有1和它本身。 如果数c不是素数,则还有其他因子。设a,b.定有一个大于sqrt(c) ,一个小于sqrt(c) 。所以m一定有一个小于等于其平方根的因数,那么验证素数时就只需要验证到其平方根就可以了。

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n;
	cin>>n;
	bool flag=1;
	for(int i=2;i<sqrt(n);i++){
		if(n%i==0){
			flag=0;
			break;
		}
	}
	if(flag)cout<<"YES";
	else cout<<"NO";
	return 0;
}

3.埃氏筛法 

要得到自然数n以内的全部素数,必须把不大于根号n的所有素数的倍数剔除,剩下的就是素数。

#include<bits/stdc++.h>
using namespace std;
bool flag[104];
int main()
{
    memset(flag,1,sizeof(flag));
    flag[1]=0;
    for(int i=2;i<=sqrt(100);i++){
        if(flag[i]){
            for(int j=2;j*i<=100;j++)flag[i*j]=0;
        }
    }
    for(int i=1;i<=100;i++){
        if(flag[i])cout<<"YES"<<endl;
        else cout<<"NO"<<endl;
    }
    return 0;
}

4.欧拉筛法: 

找到一个素数后,就将它的倍数标记为合数,也就是把它的倍数筛掉;如果一个数没有被比它小的素数筛掉,那它就是素数。

欧拉筛法复杂度为线性。

例题:

素数个数

素数个数 - 洛谷

题目描述

求 1,2,⋯,N 中素数的个数。

输入格式

一行一个整数 N。

输出格式

一行一个整数,表示素数的个数。

题解:

数据范围是10的8次方,不能一个一个判断,要用欧拉筛法。

#include<bits/stdc++.h>
using namespace std;
int n,ans,prime[5800001];
bool visit[100000001];
int main() 
{
	cin>>n;
	if(n<2){
		cout<<0;
		return 0;
	}
	for(register int i=2; i<=n;i++) {
		if(!visit[i])prime[++ans]=i;
		for(register int j=1; prime[j]*i<=n&&j<=ans; ++j) {
			visit[i*prime[j]]=true;
			if(!(i%prime[j])) break;
		}
	}
	//for(int i=1; i<=ans; ++i) printf("%d\n",prime[i]);
	cout<<ans;
	return 0;
}

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

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

相关文章

Ubuntu 申请 SSL证书并搭建邮件服务器

文章目录 Log 一、域名连接到泰坦&#xff08;Titan&#xff09;电子邮件二、NameSilo Hosting 避坑三、Ubuntu 搭建邮件服务器1. 环境准备2. 域名配置3. 配置 Postfix 和 Dovecot① 安装 Nginx② 安装 Tomcat③ 申请 SSL 证书&#xff08;Lets Encrypt&#xff09;④ 配置 pos…

ORA-12528: TNS: 监听程序: 所有适用例程都无法建立新连

用了网上的办法&#xff1a; 1、修改listener.ora的参数,把动态的参数设置为静态的参数,红色标注部分 位置D:\oracle\product\10.2.0\db_1\NETWORK\ADMIN SID_LIST_LISTENER (SID_LIST (SID_DESC (SID_NAME PLSExtProc) (ORACLE_HOME D:\oracle\produ…

C++练习题1-9

文章目录 NO1、选出妃子、宫女和嬷嬷No2、根据数字判断月份No3、循环计数No4、循环选数No5、玩转字符No6、计算字符串长度No7、显示字符串中的字符No8、字符串反转No9、二维数组的应用 NO1、选出妃子、宫女和嬷嬷 其他要求&#xff1a; 超女用结构体表示不要嵌套if输入所有数据…

博物馆环境监控系统的需求是怎么来的???

一、博物馆环境基本调研和识别需求 在环境监测软件的需求中&#xff0c;首要任务是进行深入的基本调研。这包括把握已有的环境监测技术、标准与法规&#xff0c;以及用户的实际操作过程和困惑。积极与环保局、科研院所、公司等沟通&#xff0c;可搜集很多原始记录&#xff0c;…

MySQL的SQL分类与数据类型

MySQL是一款广泛使用的关系型数据库管理系统&#xff0c;开源、免费且跨平台&#xff0c;常用于存储、管理和检索结构化数据&#xff0c;并通过SQL语言支持高效的数据操作与管理。 文章目录 何为SQLSQL分类DDLDMLDCLTCLDQL MySQL的数据类型数值型日期型字符串型二进制型其他类型…

网安培训第一期——sql注入+文件

文章目录 sql inject报错注入time盲注联合查询万能密码拦截和过滤ascii注入流程base64查询的列名为mysql保留关键字key 文件上传ffuf脚本要做的三件事网络端口进程用户权限文件文件包含文件下载XSS跨站请求攻击csrf跨站请求伪造 sql inject 判断输入字段是字符串还是数字 方法…

【GitHub项目推荐--开源小游戏】【转载】

01 回合制生存游戏 Cataclysm-DDA 是一款回合制生存游戏&#xff0c;背景设置在后世界末日的世界中。虽然有些人将其描述为“僵尸游戏”&#xff0c;但《大灾变》远不止这些。努力在一个严酷、持久、程序生成的世界中生存。 为食物、设备寻找一个死去的文明的残余物。或者&am…

arcgis 面要素shp数据处理

面要素是工作中用到最多的&#xff0c;那么面要素是如何形成的呢&#xff0c;主要还是由闭合的线要素转换而成。在面要素数据中常用的有以下几点&#xff1a; 一、 线转面&#xff08;要素转面&#xff09; 通过上一篇得到了点转线的要素&#xff0c;那么根据上节的线要素&am…

大模型学习笔记一:大模型应用开发基础

文章目录 一、大模型一些概念介绍 一、大模型一些概念介绍 1&#xff09;产品和大模型的区别&#xff08;产品通过调用大模型来具备的能力&#xff09; 2&#xff09;AGI定义 概念&#xff1a;一切问题可以用AI解决 3&#xff09;大模型通俗原理 根据上文&#xff0c;猜测下…

1174:长整数排序(指针专题)

题目描述 长整数排序。输入n 然后输入n个位数不超过100位的大整数&#xff0c;输入的整数可能含有前导0。将这n个长整数排序后输出&#xff0c;输出不含前导0。int greater(char *s1, char *s2){若s1指向的整数大于s2指向的整数&#xff0c;返回一个正整数;若s1指向的整数小于s…

重生之C++王者归来DAY1

c的概述 c的编程思想&#xff1a;面向对象、泛型编程。 1.第一个c程序 本文用的是QT&#xff0c;VS之类的也可 2.c面向对象的三大特性&#xff08;重要&#xff09; 封装:将相同属性的数据和方法封装在一起&#xff0c;加权限区分&#xff0c;用户只能借助公共方法操作 私有…

PCL 高斯投影正算:大地坐标转高斯投影坐标(C++详细过程版)

目录 一、算法原理二、代码实现三、结果展示四、测试数据PCL 高斯投影正算:大地坐标转高斯投影坐标(C++详细过程版)由CSDN点云侠原创。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、算法原理 二、代码实现 头文件及读取保存函数见:

SAP同步异常2:SAP删除获利能力特征字段后VF02发货过帐报错。

测试环境VF02过帐报错&#xff0c; 原因是之前删除已经激并使用的获利能力特征字段后&#xff0c;只处理了数据库&#xff0c;没有处理程序。 处理方案&#xff1a; 1、 KEA0 维护经营关注点&#xff1a; 这里WW291已经删除&#xff0c;但没有激活程序。 退出后&#xff…

web安全学习笔记【09】——算法2

基础[1] 入门-算法逆向&散列对称非对称&JS源码逆向&AES&DES&RSA&SHA #知识点&#xff1a; 1、Web常规-系统&中间件&数据库&源码等 2、Web其他-前后端&软件&Docker&分配站等 3、Web拓展-CDN&WAF&OSS&反向&负载…

2.数据结构 顺序表(自留笔记)

文章目录 一.静态顺序表&#xff1a;长度固定二.动态顺序表1.下面证明原地扩容和异地扩容代码如下&#xff1a;2.下面是写一段Print&#xff0c;打印数字看看&#xff1a;3.头插4.尾删5.头删6.越界一定会报错吗7.下标插入8.下标删除9.查找数字10.应用&#xff1a;利用顺序表写一…

跨平台同步 Shell 历史记录,无缝切换会话 | 开源日报 No.154

atuinsh/atuin Stars: 14.3k License: MIT Atuin 是一个用 SQLite 数据库替换现有 shell 历史记录的工具&#xff0c;可以记录命令的额外上下文&#xff0c;并提供可选且完全加密的历史同步功能。其主要功能和核心优势包括&#xff1a; 重新绑定 ctrl-r 和 up (可配置) 到全屏…

安装宝塔面板后k8s所在节点pod无法正常工作解决方法,kubernetes k8s 与宝塔面板冲突解决方法

在实际项目过程中我们使用了k8s 在生产环境中运行管理服务。 但是对服务器的状态管理我们使用了宝塔面板进行 K8s 版本1.2.8 宝塔面板 版本 8.05 操作步骤是这样的。 1.完成1.2.8 k8s的节点安装&#xff0c;并正常运行服务。 过程略 2.安装宝塔面板 ​ yum install -y …

不要在细节上雕花

前段时间在网上看到一张趣图,有人在社交网络分享学习编程的笔记,一行行手抄代码,字迹清晰,排版工整,霎是认真。 这可能只是个梗,但它让我想起我的学生年代。许多年前我还在念书的时候,班上有不少非常认真的同学,热衷于把课堂笔记做得非常漂亮、工整,有些甚至要用尺子对…

vue —— h函数的学习与使用

文章目录 一、h函数是什么&#xff1f;二、h函数格式说明及使用示例1&#xff1a;简单创建一个VNode&#xff08;vue3&#xff09;示例2&#xff1a;vue2中h函数用法示例3&#xff1a;vue3中h函数的用法vue2和vue3中h函数的区别&#xff1f; 三、h函数实现原理四、h函数常用场景…

java每日一记 —— MySQL窗口函数的使用

MySQL窗口函数 1.什么时窗口函数2.窗口函数的基本应用2.1.排序函数2.2.分布函数2.3.前后函数2.4.头尾函数2.5.聚合函数2.6.其他函数 窗口函数时MySQL8.0中的 注意&#xff1a;窗口函数也有人称为“开窗函数” 1.什么时窗口函数 引入问题&#xff1a;让我们从一个实际的问题开始…