算法刷题day43

news2024/11/20 4:42:07

目录

  • 引言
  • 已知信息
  • 一、公约数
  • 二、序列的第k个数
  • 三、越狱
  • 四、等差数列
  • 五、公约数
  • 六、质因数个数
  • 七、完全平方数
  • 八、阶乘分解

引言

今天复习的是快速幂的剩余问题、质数、约数的问题,发现其实不难,都是在基础的模板上进行变化,但是不好想,基本自己是想不出来的,所以这种问题还是要事先做过之后才会做,所以得多刷题了,加油!

已知信息

在int范围内约数个数最多的有1600个,在 1 0 9 10^9 109 范围内有1344个


一、公约数

标签:最大公约数、试除法、二分

思路:先求出所有 a , b a,b a,b 的公约数,然后用二分找到最大的即可。求所有公约数,可以先求出最大公约数,然后对其进行分解约数即可,最后排个序。
在这里插入图片描述

题目描述:

给定两个正整数 a 和 b。

你需要回答 q 个询问。

每个询问给定两个整数 l,r,你需要找到最大的整数 x,满足:

x 是 a 和 b 的公约数。l≤x≤r。

输入格式
第一行包含两个整数 a,b。

第二行包含一个整数 q。

接下来 q 行,每行包含两个整数 l,r.

输出格式
每个询问输出一行答案,即满足条件的最大的 x,如果询问无解,则输出 −1。

数据范围
前六个测试点满足 1≤a,b≤100,1≤q≤20。
所有测试点满足 1≤a,b≤109,1≤q≤104,1≤l≤r≤109。

输入样例:
9 27
3
1 5
10 11
9 11
输出样例:
3
-1
9

示例代码:

#include <bits/stdc++.h>

using namespace std;

typedef long long LL;
typedef pair<int,int> PII;
#define x first
#define y second

const int N = 1350;

int a, b, q;
int divisors[N], cnt;

int gcd(int a, int b)
{
	return b ? gcd(b,a%b) : a;
}

void init(int a, int b)
{
	int d = gcd(a,b);
	
	for(int i = 1; i <= d / i; ++i)
	{
		if(d % i == 0)
		{
			divisors[cnt++] = i;
			if(d / i != i) divisors[cnt++] = d / i;
		}
	}
	sort(divisors,divisors+cnt);
}

int main()
{
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	
	cin >> a >> b >> q;
	
	init(a, b);
	while(q--)
	{
		int x, y; cin >> x >> y;
		
		int res = -1;
		int l = 0, r = cnt - 1;
		while(l < r)
		{
			int mid = (LL)l + r + 1 >> 1;
			if(divisors[mid] <= y) l = mid;
			else r = mid - 1;
		}
		
		if(divisors[r] >= x && divisors[r] <= y) res = divisors[r];
		cout << res << endl;
	}
	
	return 0;
}

二、序列的第k个数

标签:快速幂

思路:首先判断出是等比数列还是等差数列,然后再用等差数列公式和等比数列公式求出来就行了 等差数列: a k = a 1 + ( k − 1 ) ∗ d 等差数列:a_k = a_1 + (k - 1) * d 等差数列:ak=a1+(k1)d 等比数列: a k = a 1 ∗ d k − 1 等比数列:a_k = a_1 * d^{k-1} 等比数列:ak=a1dk1

题目描述:

BSNY 在学等差数列和等比数列,当已知前三项时,就可以知道是等差数列还是等比数列。

现在给你 整数 序列的前三项,这个序列要么是等差序列,要么是等比序列,你能求出第 k 项的值吗。

如果第 k 项的值太大,对其取模 200907。

输入格式
第一行一个整数 T,表示有 T 组测试数据;

对于每组测试数据,输入前三项 a,b,c,然后输入 k。

输出格式
对于每组数据,输出第 k 项取模 200907 的值。

数据范围
1≤T≤100,1≤a≤b≤c≤109,1≤k≤109
输入样例:
2
1 2 3 5
1 2 4 5
输出样例:
5
16

示例代码:

#include <bits/stdc++.h>

using namespace std;

typedef long long LL;
typedef pair<int,int> PII;
#define x first
#define y second

const int N = 1e5+10, MOD = 200907;

int n, m;

LL qmi(LL a, LL k)
{
	LL res = 1;
	while(k)
	{
		if(k&1) res = res * a % MOD;
		k >>= 1;
		a = a * a % MOD;
	}
	return res;
}

int main()
{
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	
	int T; cin >> T;
	while(T--)
	{
		int a, b, c, k; cin >> a >> b >> c >> k;
		if(b - a == c - b)  //等差数列 
		{
			int d = b - a;
			LL res = ((LL)a % MOD + (LL)(k - 1) % MOD * d % MOD) % MOD;
			cout << res << endl;
		}
		else 
		{
			int d = b / a;
			LL res = a * qmi(d,k-1) % MOD;
			cout << res << endl;
		}
	}
	
	return 0;
}

三、越狱

标签:快速幂、组合计数

思路:首先总共有 m n m^n mn 种可能的结果,不发生越狱的情况为 m ∗ ( m − 1 ) n − 1 m * (m-1)^{n-1} m(m1)n1 种可能,如下图:
在这里插入图片描述
所以发生越狱的可能情况为: m n − m ∗ ( m − 1 ) n − 1 m^n - m * (m-1)^{n-1} mnm(m1)n1 ,用 快速幂 求解即可。

题目描述:

监狱有连续编号为 1 到 n 的 n 个房间,每个房间关押一个犯人。

有 m 种宗教,每个犯人可能信仰其中一种。

不存在没有信仰的犯人。

如果相邻房间的犯人信仰的宗教相同,就可能发生越狱。

求有多少种状态可能发生越狱。

输入格式
共一行,包含两个整数 m 和 n。

输出格式
可能越狱的状态数,对 100003 取余。

数据范围
1≤m≤108,1≤n≤1012
输入样例:
2 3
输出样例:
6
样例解释
所有可能的 6 种状态为:(000)(001)(011)(100)(110)(111)。

示例代码:

#include <bits/stdc++.h>

using namespace std;

typedef long long LL;
typedef pair<int,int> PII;
#define x first
#define y second

const int N = 1e5+10, MOD = 100003;

LL m, n;

LL qmi(LL a, LL k)
{
	LL res = 1;
	while(k)
	{
		if(k&1) res = res * a % MOD;
		k >>= 1;
		a = a * a % MOD;
	}
	return res;
}

int main()
{
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	
	cin >> m >> n;
	
	LL res = (qmi(m,n) - m * qmi(m-1,n-1) % MOD + MOD) % MOD;
	cout << res << endl;
	
	return 0;
}

四、等差数列

标签:数论、最大公约数

思路:先排个序,然后求出各项差之间的最大公约数,即就是 d d d ,然后用公式 a [ n − 1 ] − a [ 0 ] d + 1 \frac{a[n-1] - a[0]}{ d} + 1 da[n1]a[0]+1 ,如果 d d d 0 0 0 ,直接输出 n n n 即可。

题目描述:

数学老师给小明出了一道等差数列求和的题目。

但是粗心的小明忘记了一部分的数列,只记得其中 N 个整数。

现在给出这 N 个整数,小明想知道包含这 N 个整数的最短的等差数列有几项?

输入格式
输入的第一行包含一个整数 N。

第二行包含 N 个整数 A1,A2,⋅⋅⋅,AN。(注意 A1∼AN 并不一定是按等差数列中的顺序给出)

输出格式
输出一个整数表示答案。

数据范围
2≤N≤100000,0≤Ai≤109
输入样例:
5
2 6 4 10 20
输出样例:
10
样例解释
包含 2、6、4、10、20 的最短的等差数列是 2、4、6、8、10、12、14、16、18、20。

示例代码:

#include <bits/stdc++.h>

using namespace std;

typedef long long LL;
typedef pair<int,int> PII;
#define x first
#define y second

const int N = 1e5+10;

int n;
int a[N];

int main()
{
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	
	cin >> n;
	for(int i = 0; i < n; ++i) cin >> a[i];
	sort(a,a+n);
	
	int d = 0;
	for(int i = 1; i < n; ++i) d = gcd(a[i]-a[0],d);
	
	if(!d) cout << n << endl;
	else cout << ((a[n-1] - a[0]) / d + 1) << endl;
	
	return 0;
}

五、公约数

标签:数学知识、约数、试除法、因式分解

思路:用试除法操作即可,时间复杂度为 N \sqrt{N} N

题目描述:

输入 n 个整数,依次输出每个数的约数的个数。

输入格式
第一行包含整数 n。

第二行包含 n 个整数 ai。

输出格式
共 n 行,按顺序每行输出一个给定整数的约数的个数。

数据范围
1≤n≤1000,1≤ai≤109
输入样例:
5
1 3 4 6 12
输出样例:
1
2
3
4
6

示例代码:

#include <bits/stdc++.h>

using namespace std;

typedef long long LL;
typedef pair<int,int> PII;
#define x first
#define y second

const int N = 1e5+10;

int n;

int get_divisors(int n)
{
	int res = 0;
	for(int i = 1; i <= n / i; ++i)
	{
		if(n % i == 0)
		{
			res++;
			if(n / i != i) res++;
		}
	}
	return res;
}

int main()
{
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	
	cin >> n;
	while(n--)
	{
		int t; cin >> t;
		cout << get_divisors(t) << endl;
	}
	
	return 0;
}

六、质因数个数

标签:数论、分解质因数

思路:就分解质因数即可。

题目描述:

给定正整数 n,请问有多少个质数是 n 的约数。

输入格式
输入的第一行包含一个整数 n。

输出格式
输出一个整数,表示 n 的质数约数个数。

数据范围
对于 30% 的评测用例,1≤n≤10000。
对于 60% 的评测用例,1≤n≤109。
对于所有评测用例,1≤n≤1016。

输入样例:
396
输出样例:
3
样例解释
396
 有 2,3,11 三个质数约数。

示例代码:

#include <bits/stdc++.h>

using namespace std;

typedef long long LL;
typedef pair<int,int> PII;
#define x first
#define y second

const int N = 1e5+10;

LL n;

int main()
{
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	
	cin >> n;
	
	int res = 0;
	for(LL i = 2; i <= n / i; ++i)
	{
		if(n % i == 0)
		{
			res++;
			while(n % i == 0) n /= i;
		}
	}
	if(n > 1) res++;
	
	cout << res << endl;
	
	return 0;
}

七、完全平方数

标签:分解质因数

思路:由算数基本定理可知,每个数都是由其质因数组成的,那么一个数能被称为完全平方数,那么其每个质因数的次数都是偶数,那么要求一个 x x x ,使得 n ⋅ x n \cdot x nx 为一个完全平方数,那么将其每个质因数变为偶数即可,所以也就是对其分解质因数,个数为奇数加进答案里。

题目描述:

一个整数 a 是一个完全平方数,是指它是某一个整数的平方,即存在一个整数 b,使得 a=b2。

给定一个正整数 n,请找到最小的正整数 x,使得它们的乘积是一个完全平方数。

输入格式
输入一行包含一个正整数 n。

输出格式
输出找到的最小的正整数 x。

数据范围
对于 30% 的评测用例,1≤n≤1000,答案不超过 1000。
对于 60% 的评测用例,1≤n≤108,答案不超过 108。
对于所有评测用例,1≤n≤1012,答案不超过 1012。

输入样例1:
12
输出样例1:
3
输入样例2:
15
输出样例2:
15

示例代码:

#include <bits/stdc++.h>

using namespace std;

typedef long long LL;
typedef pair<int,int> PII;
#define x first
#define y second

const int N = 1e5+10;

LL n;

int main()
{
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	
	cin >> n;
	
	LL res = 1;
	for(int i = 2; i <= n / i; ++i)
	{
	    if(n % i == 0)
	    {
	        int s = 0;
	        while(n % i == 0) s++, n /= i;
	        if(s % 2) res *= i;
	    }
	}
	if(n > 1) res *= n;
	
	cout << res << endl;
	
	return 0;
}

八、阶乘分解

标签:数学知识、质数

思路:先求出 1 ∼ n 1\sim n 1n 的所有质数,用 线性筛法 即可。然后遍历每个质数出现了几次,可以用 s = ⌊ n p ⌋ + ⌊ n p 2 ⌋ +   ⋯   + ⌊ n p k ⌋ s = \lfloor\frac{n}{p}\rfloor + \lfloor\frac{n}{p^2}\rfloor +\ \cdots\ + \lfloor\frac{n}{p^k}\rfloor s=pn+p2n+  +pkn 求出来即可。

题目描述:

给定整数 N,试把阶乘 N! 分解质因数,按照算术基本定理的形式输出分解结果中的 pi 和 ci 即可。

输入格式
一个整数 N。

输出格式
N! 分解质因数后的结果,共若干行,每行一对 pi,ci,表示含有 pcii 项。按照 pi 从小到大的顺序输出。

数据范围
3≤N≤106
输入样例:
5
输出样例:
2 3
3 1
5 1
样例解释
5!=120=23∗3∗5

示例代码:

#include <bits/stdc++.h>

using namespace std;

typedef long long LL;
typedef pair<int,int> PII;
#define x first
#define y second

const int N = 1e6+10;

int primes[N], cnt;
bool st[N];

void get_primes(int n)
{
	for(int i = 2; i <= n; ++i)
	{
	    if(!st[i]) primes[cnt++] = i;
	    for(int j = 0; primes[j] * i <= n; ++j)
	    {
	        st[primes[j] * i] = true;
	        if(i % primes[j] == 0) break;
	    }
	}
}

int main()
{
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	
	int n; cin >> n;
	get_primes(n);
	
	
	for(int i = 0; i < cnt; ++i)
	{
		int p = primes[i];
		int s = 0;
		for(int j = n; j; j /= p) s += j / p;
		cout << p << " " << s << endl;
	}

	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RobotFramework功能自动化测试框架基础篇

概念 RobotFramework是什么&#xff1f; Robot Framework是一款python编写的功能自动化测试框架。具备良好的可扩展性&#xff0c;支持关键字驱动&#xff0c;可以同时测试多种类型的客户端或者接口&#xff0c;可以进行分布式测试执行。主要用于轮次很多的验收测试和验收测试…

2023年看雪安全技术峰会(公开)PPT合集(11份)

2023年看雪安全技术峰会&#xff08;公开&#xff09;PPT合集&#xff0c;共11份&#xff0c;供大家学习参阅。 1、MaginotDNS攻击&#xff1a;绕过DNS 缓存防御的马奇诺防线 2、从形式逻辑计算到神经计算&#xff1a;针对LLM角色扮演攻击的威胁分析以及防御实践 3、TheDog、0…

Vue.js前端开发零基础教学(五)

目录 4.1 动态组件 4.1.1 定义动态组件 4.1.2 利用KeepAlive组件实现组件缓存 4.1.3 组件缓存相关的生命周期函数 4.1.4 KeepAlive组件的常用属性 4.2 插槽 4.2.1 什么是插槽 ​编辑 4.2.2 具名插槽 4.2.3 作用域插槽 4.3 自定义指令 4.3.1 什么是自定义指令…

“木偶猴帝国”渐起,BRC-20生态Meme币PUPS成为新星

比特币生态中基于BRC20协议的木偶猴代币PUPS在最近一周内价格暴涨1101%&#xff0c;达到了44.56美元&#xff0c;而其他一些BRC20代币&#xff0c;如WZRD、W☮、ZBIT、$π等也经历了显著的价格上涨&#xff0c;带动交易量攀升。 PUPS正在形成一种图币新玩法&#xff0c;与木偶…

Nacos下载安装、案例解析(代码+注解)

简介&#xff1a;Nacos 在阿里巴巴起源于 2008 年五彩石项目&#xff08;完成微服务拆分和业务中台建设&#xff09;&#xff0c;成长于十年双十一的洪峰考验&#xff0c;沉淀了简单易用、稳定可靠、性能卓越的核心竞争力。 目录 1、Nacos下载安装 2、项目应用 2.1 添加依赖…

基于Springboot的餐厅点餐系统

基于SpringbootVue的餐厅点餐系统的设计与实现 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringbootMybatis工具&#xff1a;IDEA、Maven、Navicat 系统展示 首页展示 菜品详情页 菜品信息 个人中心 后台管理 菜品信息管理 用户管理 菜…

AI大模型之idea通义灵码智能AI插件安装方式

问题描述 主要讲述如何进行开发工具 idea中如何进行通义灵码的插件的安装解决方案 直接在idea的plugin市场中安装 下载插件之后进行安装 见资源

每日一题:无重复字符的最长子串

给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是"abc"&#xff0c;所以其长度为 3。示例 2: 输入: s "bbbbb" 输出: 1 解释: 因为无重…

第十二讲 查询计划 优化

到目前为止&#xff0c;我们一直在说&#xff0c;我们得到一个 SQL 查询&#xff0c;我们希望可以解析它&#xff0c;将其转化为某种逻辑计划&#xff0c;然后生成我们可以用于执行的物理计划。而这正是查询优化器【Optimizer】的功能&#xff0c;对于给定的 SQL &#xff0c;优…

ViT-DeiT:用于乳腺癌组织病理图像分类的集成模型

两种预训练Vision Transformer模型的集成模型&#xff0c;即Vision Transformer和数据高效视觉Transformer&#xff08;Data-Efficient Image Transformer&#xff09;。此集成模型是一种软投票模型。 近年来&#xff0c;乳腺癌的分类研究主要集中在超声图像分类、活检数据分类…

BUUCTF刷题十一道(12)附-SSTI专题二

文章目录 学习文章[CISCN2019 华东南赛区]Web11【存疑】[RootersCTF2019]I_<3_Flask 学习文章 SSTI-服务端模板注入漏洞 flask之ssti模板注入从零到入门 CTFSHOW SSTI篇-yu22x SSTI模板注入绕过&#xff08;进阶篇&#xff09;-yu22x SSTI模板注入学习-竹言笙熙 全部总结看最…

音视频学习—音视频理论基础(2)

音视频学习—音视频理论基础&#xff08;2&#xff09; 1、音频的基本概念2、声音的三要素3、声音的本质4、奈奎斯特采样定律5、采样和采样率6、采样数和采样位数7、量化8、比特率&#xff08;码率&#xff09;9、响度和强度10、编码11、音频帧12、音频文件大小的计算总结 1、音…

华为OD机试 - 小朋友至少有几个(Java 2024 C卷 100分)

华为OD机试 2024C卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷C卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测试…

Springboot+Vue项目-基于Java+Mysql的网上订餐系统(附源码+LW+演示录像)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

从0到1实现RPC | 11 丰富测试案例

测试案例主要针对服务消费者consumer&#xff0c;复杂逻辑都在consumer端。 常规int类型&#xff0c;返回User对象 参数类型转换&#xff0c;主要实现逻辑都在TypeUtils工具类中。 测试方法重载&#xff0c;同名方法&#xff0c;参数不同 方法签名的实现&#xff0c;主要逻辑…

蓝桥杯-可获得最小值

前缀和思想: #include<bits/stdc.h>using namespace std;long long n,k;const int N200010;long long a[N],sum[N];int main() {cin>>n>>k;for(int i1;i<n;i)cin>>a[i];sort(a1,a1n);for(int i1;i<n;i){sum[i]sum[i-1]a[i];}long long ans1e18;…

朴素模式匹配算法

什么是字符串的模式匹配&#xff1f; 字符串模式匹配:在主串中找到与模式串相同的字串&#xff0c;并返回其所在位置 算法思想&#xff1a; 算法思想为:从主串S的第一个字符起&#xff0c;与模式串T的第一个字符比较,若相等&#xff0c;则继续逐个比较后续字符;否则从主串的下一…

【JSON2WEB】14 基于Amis的CRUD开发30分钟速成

【JSON2WEB】系列目录 【JSON2WEB】01 WEB管理信息系统架构设计 【JSON2WEB】02 JSON2WEB初步UI设计 【JSON2WEB】03 go的模板包html/template的使用 【JSON2WEB】04 amis低代码前端框架介绍 【JSON2WEB】05 前端开发三件套 HTML CSS JavaScript 速成 【JSON2WEB】06 JSO…

深入剖析MongoDB集群架构设计

目录 一、MongoDB集群架构介绍 1.1 主从复制 1.2 副本集 1.3 分片集群 二、副本集 3.1 主节点选举 3.2 oplog 3.2 主从同步 三、分片集群 3.1 分片策略 3.2 分片键的选择 3.3 何时选择分片集群 四、总结 一、MongoDB集群架构介绍 MongoDB 有三种集群架构模式&#xff0c;分…

【AI微】将AI对接进微信中,为你赋能一个小助理

程序猿日常 让微信拥有AI聊天功能&#xff1a;自然语言处理、知识储备、个性化服务效果演示 AI微 部分代码讲解 项目采用AndroidAutojs技术&#xff0c;编程语言涉及kotlinjavajs 检测是否停留在指定聊天页面 var ltxxLayoutdesc("聊天信息").findOne(100); if(lt…