约数(因数)问题(ACwing算法笔记)

869.试除法求约数

注意点:

1.试除法就是让i遍历的最大值到a/i。

2.约数成对存在,只遍历前一部分即可。

代码:

#include<iostream>
#include<queue>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;

priority_queue<int,vector<int>,greater<int>> qu;
void get(int a){
	for(int i = 1;i<=a/i;++i){
		if(a%i==0)
		{
			qu.push(i);
			if(i!=a/i){
				qu.push(a/i);
			}
		}
	}
} 

 
int main (){
	int n;scanf("%d",&n);
	while(n--){
		int a;scanf("%d",&a);
		get(a);
		while(!qu.empty()){
		printf("%d ",qu.top());qu.pop();
		}puts("");
	}
	
	return 0;
} 

约数个数与约数之和

870.约数个数

分为两个部分:

1.求质因子及其次数,通过a/=i   i<=a/i求得

2.求得的次数放在unordered_map中,非常好的工具,可以之际用auto p:map遍历。

3.求解的公式如上

代码:

#include<iostream>
#include<queue>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<unordered_map>
using namespace std;
unordered_map<int,int> ma;
typedef  long long ll;
const int mod = 1e9+7;
int main (){
	int n;cin>>n;
	while(n--){
		int a;scanf("%d",&a);
		for(int i = 2;i<=a/i;++i){
			while(a%i==0){
				a/=i;
				ma[i]++;
				//cout<<i<<endl;
			}
		}
		if(a>1){
			ma[a]++;
		//	cout<<a<<endl;
		}
	}
	ll res =1;
	for(auto p:ma){
		res = res*(p.second+1)%mod;	
	}
	cout<<res;
	return 0;
} 

871.约数之和

方法一样,先分解质因数,将分解后的结果存入map中

在按照公式求解

关键的一点就是,long long 的数据相乘与取模。很容易出错,很容易越界。注意y总的处理。如何处理 

每一次乘以n再加一。

1

n+1

n(n+1)+1 = n^2 +n+1

n(n(n+1) +1= n^3+n^2+n+1

……

#include<iostream>
#include<queue>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<unordered_map>
using namespace std;
const int mod = 1e9+7;
unordered_map<int,int> ma;
typedef long long ll;
int main (){
	int n;scanf("%d",&n);
	while(n--){
		int a;scanf("%d",&a);
		for(int i = 2;i<=a/i;++i){
			while(a%i==0){
				a/=i;
				ma[i]++;
			}
		}
		if(a>1)ma[a]++;
	}
	ll ou = 1;
	for(auto p:ma){
		ll di = p.first;
		ll zhi =p.second;
		ll nu = 1;
		for(int i = 1;i<=zhi;++i){
			nu =(nu*di+1)%mod;
		}
		ou = nu*ou%mod;
	}
	printf("lld",ou);
	return 0;
} 

872.辗转相除法(欧几里得法)求最大公约数

题解详见:

https://www.acwing.com/solution/content/145791/

不用担心输入的a小于b,如果小于b 则在运算中会先将其交换,再辗转相除。

左边存大的,右边存小的。每一次相除完,将左边剔除,右边左移。%运算后的c填补右边的空。直至右边为0为止,则最大公约数就是左边的数。

#include<iostream>
#include<queue>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<unordered_map>
using namespace std;

int main (){
	int n;cin>>n;
	while(n--){
		int a,b;scanf("%d%d",&a,&b);
		//左边放大的,右边放小的
		//相除完后,右边左移,余数上右边,再相除,直至右边为0 
		while(b){
			int c = a%b;
			a = b;
			b = c;
		}
		cout<<a<<endl;
	}
	
	return 0;
} 



//递归形式
#include<iostream>
#include<queue>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<unordered_map>
#include<vector>
using namespace std;

int gc(int a,int b){
	if(b==0){
		return a;
	} 
	return gc(b,a%b);
} 

int main (){
	int n;cin>>n;
	while(n--){
		int a,b;cin>>a>>b;
		int x;int y;
		cout<<gc(a,b)<<endl;;
	}
	
	return 0;
} 

877.扩展欧几里得法求最大公约数及其系数

#include<iostream>
#include<queue>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<unordered_map>
#include<vector>
using namespace std;

int gc(int a,int b,int &x,int &y){
	if(b==0){
		x = 1;
		y = 0;
		return a;
	} 
	int d = gc(b,a%b,x,y);
	int x2 = x;
	int y2 = y;
	y = x2-(a/b)*y2;
	x = y2;
	return d;
} 

int main (){
	int n;cin>>n;
	while(n--){
		int a,b;cin>>a>>b;
		int x;int y;
		gc(a,b,x,y);
		cout<<x<<" "<<y<<endl;
	}
	
	return 0;
} 

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

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

相关文章

Go语言学习04~05 函数和面向对象编程

Go语言学习04-函数 函数是一等公民 <font color"Blue">与其他主要编程语言的差异</font> 可以有多个返回值所有参数都是值传递: slice, map, channel 会有传引用的错觉函数可以作为变量的值函数可以作为参数和返回值 学习函数式编程 可变参数 func s…

刷题28-30(力扣0322/0078/0221)

0322. 零钱兑换 题目&#xff1a; 给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数 amount &#xff0c;表示总金额。计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额&#xff0c;返回 -1 。你可以…

LLM - 大语言模型的分布式训练 概述

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/136924304 大语言模型的分布式训练是一个复杂的过程&#xff0c;涉及到将大规模的计算任务分散到多个计算节点上。这样做的目的是为了处…

java面试:常见的限流算法有哪些

1 什么是限流算法 限流算法是一种用于限制流量请求的频率或速率的算法&#xff0c;其目的是在高并发或大流量请求的情况下&#xff0c;保护系统服务的安全性和可用性。限流算法可以应对热点业务带来的突发请求、调用方bug导致的突发请求以及恶意攻击请求等情况。是一种系统保护…

10W字解析 SpringBoot技术内幕文档,实战+原理齐飞,spring事务实现原理面试

第3章&#xff0c;Spring Boot构造流程源码分析&#xff0c;Spring Boot的启动非常简单&#xff0c;只需执行一个简单的main方法即可&#xff0c;但在整个main方法中&#xff0c;Spring Boot都做了些什么呢&#xff1f;本章会为大家详细讲解Spring Boot启动过程中所涉及的源代码…

《深入解析 C#》—— C# 3 部分

文章目录 第三章 C#3&#xff1a;LINQ及相关特性3.1 自动实现属性&#xff08;*&#xff09;3.2 隐式类型 var&#xff08;*&#xff09;3.3 对象和集合初始化3.3.1 对象初始化器3.3.2 集合初始化器 3.4 匿名类型3.4.1 基本语法和行为3.4.2 编译器生成类型3.4.3 匿名类型的局限…

Linux信号补充——信号捕捉处理

一、信号的捕捉处理 ​ 信号保存后会在合适的时间进行处理&#xff1b; 1.1信号处理时间 ​ 进程会在操作系统的调度下处理信号&#xff0c;操作系统只管发信号&#xff0c;即信号处理是由进程完成的&#xff1b; ​ 1.信号处理首先进程得检查是否有信号&#xff1b;2.进程…

双指针(对撞指针、快慢指针)

本博客将讲述OJ题中的常用的双指针 双指针的含义 双指针算法是一种常用的算法技巧&#xff0c;它通常用于在数组或字符串中进行快速查找、匹配、排序或移动操作。 双指针并非真的用指针实现&#xff0c;一般用两个变量来表示下标&#xff08;在后面都用指针来表示)。双指针算…

QML TextField 默认无法鼠标选中内容

1.import QtQuick.Controls 2.0 后的TextField默认无法选中内容如下图&#xff1a; 2.增加属性设置 selectByMouse: true 可以选中内容了 TextField{ selectByMouse: true text:"1234567890987654321" } 效果如下:

多线程(JUC, ReentrantLock, 原子类, 线程池, 信号量 Semaphore, CountDownLatch)

JUC Java.util.concurrent 包, 存放了并发编程相关的组件, 目的是更好的支持高并发任务 (多线程只是实现并发编程的一种具体方式 …) ReentrantLock 可重入互斥锁, 和 synchronized 定位类似, 用来实现互斥效果, 保证线程安全. synchronized 对对象加锁, 保护临界资源Reentreat…

面向量产!基于视觉的速度距离估计

面向量产&#xff01;基于视觉的速度距离估计 论文名称&#xff1a;Vision-based Vehicle Speed Estimation: A Survey 导读 在精确检测车速车距的方案中&#xff0c;视觉方案是非常具有挑战性的&#xff0c;但由于没有昂贵的距离传感器而大幅降低成本&#xff0c;所以潜力巨…

【现代C++】范围基于的for循环

现代C中的范围基于的for循环&#xff08;range-based for loop&#xff09;是C11引入的一项特性&#xff0c;旨在简化对容器或范围的迭代过程。这种循环语法不仅使代码更清晰易读&#xff0c;还减少了迭代时的错误。以下是范围基于的for循环的详细介绍&#xff1a; 1. 基本用法…

Vue3的与2的简单区别

Vue2选项式api Vue3组合式API setup方法的使用&#xff0c;最后需要return setup语法糖省略了内部的export default{} 和return 内容 以及组件的注册 reactive生成响应式对象&#xff0c;只能适用于复杂对象&#xff0c;简单类型不可 ref生成响应式数据&#xff1a;复杂类型和简…

leetcode 数组练习,美团优选面试题java

public int maxSubArray(int[] nums) { int countnums[0]; int resnums[0]; for(int i1;i<nums.length;i){ if(count<0){ countnums[i]; }else{ countnums[i]; } resMath.max(res,count); } return res; } 3、两数之和 利用map,来存储数组值和当前位置&…

【Review】电动汽车百人会

汽车强国靠四化--电动化、智能化、低碳化、全球化。 1.坚持电动化&#xff1a;电动化是经过二十多年反复论证的既定战略和技术路线、不能动摇、无需改变、要将电动化进行到底&#xff0c;全力攻克下一代电动化核心技术--全固态锂电池;市场方面要采用“双轮”驱动战略一方面继续…

基于PID控制器的四旋翼无人机控制系统的simulink建模与仿真,并输出虚拟现实动画

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1四旋翼无人机的动力学模型 4.2 PID控制器设计 4.3 姿态控制实现 4.4 VR虚拟现实动画展示 5.完整工程文件 1.课题概述 基于PID控制器的四旋翼无人机控制系统的simulink建模与仿真,并输出vr虚拟现实…

政安晨:【深度学习实践】【使用 TensorFlow 和 Keras 为结构化数据构建和训练神经网络】(四)—— 过拟合和欠拟合

政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: 政安晨的机器学习笔记 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; 通过增加容量或提前停止来提高性能。 在深度学习中&#…

Springboot 整合 Knife4j (API文档生成工具)

目录 一、Knife4j 介绍 二、Springboot 整合 Knife4j 1、pom.xml中引入依赖包 2、在application.yml 中添加 Knife4j 相关配置 3、打开 Knife4j UI界面 三、关于Knife4j框架中常用的注解 1、Api 2、ApiOperation ​3、ApiOperationSupport(order X) ​4、ApiImplici…

C# WPF编程-布局

C# WPF编程-布局 布局WPF布局原则布局过程布局容器布局属性Border控件StackPanel布局WrapPanel布局DockPanel布局Grid布局UniformGrid布局Canvas布局 布局 WPF布局原则 WPF窗口只能包含单个元素。为在WPF窗口中放置多个元素并创建更贴近实用的用户界面&#xff0c;需要在窗口…

linux系统----------MySQL索引浅探索

目录 一、数据库索引介绍 二、索引的作用 索引的副作用 (缺点) 三、创建索引的原则依据 四、索引的分类和创建 4.1普通索引 4.1.1直接创建索引 4.1.2修改表方式创建 4.1.3创建表的时候指定索引 4.2唯一索引 4.2.1直接创建唯一索引 4.2.2修改表方式创建 4.2.3创建表…