蓝桥杯冲击-02约数篇(必考)

news/2025/1/11 10:54:46/

文章目录

前言

一、约数是什么

二、三大模板

1、试除法求约数个数

2、求约数个数

3、求约数之和

三、真题演练


前言

约数和质数一样在蓝桥杯考试中是在数论中考察频率较高的一种,在省赛考察的时候往往就是模板题,难度大一点会结合其他知识点考察,但是仍然会用到模板,这里有三大模板,第一个是试除法求约数个数,第二个是求约数个数,第三个是求约数的和(来自y总的三个模型)


一、约数是什么

约数(约数的含义是什么) 1、意思 1.大约的数目。 2.一个数能够整除另一数,这个数就是另一数的约数。如2,3,4,6都能整除12,因此2,3,4,6都是12的约数。也叫因数。最后俩个都插到这个动态数组中,但是注意


二、三大模板

1、试除法求约数个数

算法思想:算x的约数,对 小于等于x的根号数求约数,当你求得一个约数,对应的也有另一个数是约数,就比如算12的约数,当算出3是约数,可得 4(12/ 3)也是12的约数。但是注意如果16的约数4对应的约数还是4不能在被放进去,所以要加一个特判

代码

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>using namespace std;vector<int> get_divisors(int n)
{vector <int> res;for(int i = 1;i <= n / i; i ++){if(n % i == 0){res.push_back(i);if(i != n / i) res.push_back(n/i);}}sort(res.begin(),res.end());return res;
}
int main()
{int n;cin >> n;while(n --){int x;cin >> x;vector <int> res;res = get_divisors(x);for(auto c : res){cout << c << " ";}cout << endl;}
}

2、求约数个数

如果有一个数n,且 n = p1^c1 * p2 ^ c2 * p3 ^c3 + ...... + pn^cn;

那么它的约数个数和就等于 (c1 + 1 ) * ( c2 + 1 ) * (c3 + 1 ) ....(cn + 1);

p1^c1,这样的数就是上文中所介绍的质因数,通过求质因数,在求c1 + 1的值即可。

题目·

 代码

#include <iostream>
#include <cstring>
#include <algorithm>
#include <unordered_map>
const int mod = 1e9 + 7;
typedef long long LL;
using namespace std;
int main()
{unordered_map <int,int> primes;int n;cin >> n;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] ++;}LL res = 1;for(auto c: primes){res  = res * (c.second + 1) % mod;}cout << res << endl;
}

3、求约数之和

如果有一个数n,且 n = p1^c1 * p2 ^ c2 * p3 ^c3 + ...... + pn^cn;

那么它的约数之和为(p1^0  + p2^1 + p3 ^3 + .. +p^c1) * ... *( pn^c1 + pn^c2 +pn^c3  + ...+ pn^cn)

求解方法和上面一样,先是解出质因数,然后求出约数和的过程很巧妙,看下面代码

题目

 

题解

#include <bits/stdc++.h>
typedef long long LL;
const int mod = 1e9 + 7;
using namespace std;
int main()
{unordered_map<int,int> primes;   //一个值存的是这个质因数,第二个存的是指数int n;cin >>n;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] ++;}LL res = 1;for(auto c : primes){int a = c.first,b = c.second;LL t = 1;while(b--)  t = (t * a + 1) % mod;res = res * t % mod;}cout << res << endl;
}

最后一步为什么会用这个t ,假设开始时为 

t : 1   

t :p+ 1 (t = 1 *p + 1)

t : p^2 + p  +1 ( t = (p+1) * p +1 )\

....

最后t : t=p^b+p^b−1+…+1

 

四、求最大公约数

求最大公约数,要用到欧几里得算法,就是 gcd (a,b) = gcd(b,a%b),注意b为0的时候按照欧几里得算法,b等于0,取a;

题目

 代码

#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;
int gcd(int a,int b)
{return b ? gcd(b,a%b):a ;  //b为0的时候按照欧几里得算法,b等于0,取a
}int main()
{int n;cin >> n;while(n --){int a,b;cin >> a >> b;int t =gcd(a,b);cout << t <<endl;}
}

 


 

三、真题演练

2020填空题

题目

题目描述

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

12000001200000 有多少个约数(只计算正约数)。

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M

代码

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

 


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

相关文章

C++继承[万字详解]

目录 一.继承的介绍 1.1、继承的概念 1.2、继承的定义 1.2.1、定义格式 1.2.2、继承关系和访问限定符 1.2.3、继承基类成员后&#xff0c;在子类中成员访问方式的变化 二.基类和派生类对象赋值转化 三.继承中的作用域 四.派生类的默认成员函数 ★派生类的构造函数 派…

基于libco的c++协程实现(时间轮定时器)

在后端的开发中&#xff0c;定时器有很广泛的应用。 比如&#xff1a; 心跳检测 倒计时 游戏开发的技能冷却 redis的键值的有效期等等&#xff0c;都会使用到定时器。 定时器的实现数据结构选择 红黑树 对于增删查&#xff0c;时间复杂度为O(logn)&#xff0c;对于红黑…

到底什么是线程?线程与进程有哪些区别?

上一篇文章我们讲述了什么是进程&#xff0c;进程的基本调度 http://t.csdn.cn/ybiwThttp://t.csdn.cn/ybiwT 那么本篇文章我们将了解一下什么是线程&#xff1f;线程与进程有哪些区别&#xff1f;线程应该怎么去编程&#xff1f; 目录 http://t.csdn.cn/ybiwThttp://t.csdn…

pm3包1.4版本发布----一个用于3组倾向性评分的R包

目前&#xff0c;本人写的第二个R包pm3包的1.4版本已经正式在CRAN上线&#xff0c;用于3组倾向评分匹配&#xff0c;只能3组不能多也不能少。 可以使用以下代码安装 install.packages("pm3")什么是倾向性评分匹配&#xff1f;倾向评分匹配&#xff08;Propensity Sc…

Python并发与并行

python的多线程因为GIL锁的原因是一个伪多线程 python2:100字节码或I/O阻塞进行切换python3&#xff1a;I/O阻塞进行切换&#xff0c;移除了100字节码切换 1、并发与并行 并行&#xff1a;多个程序同时运行 并发&#xff1a;伪并行&#xff0c;看起来是同时并行&#xff0c;…

SpringMVC拦截器

SpringMVC拦截器 1.什么是拦截器 SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。开发者可以自己定义一些拦截器来实现特定的功能。 **过滤器与拦截器的区别&#xff1a;**拦截器是AOP思想的具体应用。 过滤器 servlet规范中…

嵌入式软件开发之Linux下C编程

目录 前沿 Hello World&#xff01; 编写代码 编译代码 GCC编译器 gcc 命令 编译错误警告 编译流程 Makefile 基础 何为 Makefile Makefile 的引入 前沿 在 Windows 下我们可以使用各种各样的 IDE 进行编程&#xff0c;比如强大的 Visual Studio。但是在Ubuntu 下如何进…

【Kubernetes】第二十八篇 - 实现自动构建部署

一&#xff0c;前言 上一篇&#xff0c;介绍了 Deployment、Service 的创建&#xff0c;完成了前端项目的构建部署&#xff1b; 希望实现&#xff1a;推送代码 -> 自动构建部署-> k8s 滚动更新&#xff1b; 本篇&#xff0c;实现自动构建部署 二&#xff0c;推送触发构…