基础数学问题整理

news2024/11/24 16:55:34

    最近刷了一些关于基础数学问题的题目,大致是关于组合数、分解质因数还有一些思维题,题目来自洛谷的【数学1】基础数学问题 - 题单 - 洛谷,很多思路还是之前没有见过的,都是简单到一般难度的题目(橙、题、绿题),特别做个整理。

目录


组合数问题

编号

组合数问题 

分解质因数

Hankson 的趣味题

细胞分裂 

思维题

找筷子 

进制转换 

又是毕业季II


组合数问题

编号

编号 - 洛谷 

        这一题的意思就是有若干个位置,每个位置的数字范围都是 1~M[i],每个位置放置的数字都不相同,有多少排列数。

        首先升序排序,因为选择更少的一定是先排,前面范围小的可以选择的,后面范围大的也一定可以选择,而且前面排列的也一定是后面拍的其中一个选择,那么对于位置x,此时的选择就有M[i]-x+1,总的排列数量就是(M[1]-1+1)*(M[2]-2+1)*...*(M[n]-n+1),显然若其中任意一个数为0,也就是到这个位置,没有选择了,那么就是无法满足。

        记得随时取模

#include<stdio.h>
#include<algorithm>
using namespace std;
#define ll long long 
#define MOD 1000000007

int cmp(int x, int y) {
	return x < y;
}

int a[100];
int main()
{
	int n; scanf("%d", &n);
	for (int i = 1; i <= n; i++) {
		scanf("%d", a+i);
	}
	sort(a + 1, a + n + 1, cmp); // 升序排序
	 首先需要计算出所有的组合数
	ll ans = 1;
	for (int i = 1; i <= n; i++) {
		if (a[i] < i) {
			printf("0\n");
			return 0;
		}
		ans = ans * (a[i]-i+1) % MOD;
	}
	printf("%lld\n", ans);
	return 0;
}

组合数问题 

​​​​​​​​​​​​​​[NOIP2016 提高组] 组合数问题 - 洛谷 

         这一题略复杂,需要计算对于所有0<i≤n,0<j≤min(i,m),有多少对(i,j)满足k|C(i,j),其中X|Y定义为Y mod X = 0。

        对于排列数C(n,m),存在C(n,m)=C(n-1,m-1)+C(n-1,m),也就是在n个东西里面选m个东西,等于除掉任意一个东西x,选x并且在剩下n-1个选m-1的情况,加上在n-1个里面选m个东西,(学过排列组合应该能get?),也可以从代数角度证明等式。这个在图形中就表现为杨辉三角,这也是这一题计算任意C(i,j)的关键所在。

         预处理出杨辉三角后存在数组中,此时问题就变成了在一个杨辉三角中画一个矩形,计算矩形中有多少个满足的点,就比如下面计算样例1的i=3,j=3有多少满足2的倍数。

       因为有多个询问,那么问题就转为了对于任意i和j,怎么快速计算矩形内满足的数量,读题可以发现, k是恒定的,所以可以预处理出所有(i,j)对应的结果。

        定义sum[i][j]为i行到j的前缀和,f[i][j]为到i行到j列(不包括大于j列的)满足mod k=0的,也就是答案数组,那么f[i][j]=f[i-1][j]+sum[i][j]。

#include<stdio.h>
#include<algorithm>
using namespace std;
int tran[2024][2024];//记录杨辉三角
int f[2024][2024];//状态转移 //f[n][m]=f[n-1][m-1]+f[n-1][m]
int t,m,n,k;
int main()
{
	scanf("%d%d", &t,&k);
	int maxi = 2010;
	for (int i = 0; i < maxi; i++)
		tran[i][0] = 1;
	int j;
	for (int i = 1; i <= maxi; i++) {
		int sum_tmp = 0;//当前行的和
		for (j = 1; j <= i; j++) {
			//printf("(%d,%d)%d+%d,", i,j,tran[i - 1][j - 1], tran[i - 1][j]);
			tran[i][j] = (tran[i - 1][j - 1] + tran[i - 1][j])%k;// 因为后面反正也是要看是不是k的倍数的
			//printf("%d,", tran[i][j]);
			if (tran[i][j] == 0) {
				sum_tmp++;
			}
			f[i][j] = f[i - 1][j] + sum_tmp; // 计算数量
			//printf("(i=%d,j=%d)%d ",i,j, f[i][j]);
		}
		f[i][j] = f[i][j - 1];//这是为了下面一行的转移
		//printf("\n");
	}
	for (int epoch = 1; epoch <= t; epoch++) {
		scanf("%d%d", &n, &m);
		m = min(m, n);
		//printf("n=%d m=%d\n", n, m);
		printf("%d\n", f[n][m]);
	}
	return 0;
}

分解质因数

Hankson 的趣味题

[NOIP2009 提高组] Hankson 的趣味题 - 洛谷

          这一题要一个数x满足和a0的公约数是a1,和b0的最小公倍数是b1,求满足的x数量

        《趣味题》确实是很有趣味,不过前提是能做出来,一开始看到这种题目也是傻眼,完全无从下手。容易得出的是x=k1*a1=b1/k2(a1是公约数,b1是公倍数),因此k1*k2=b0/a0。

        此时还需要知道的就是在什么时候k1和k2是合法的,可以证明若x=k1*a1,a0=k2*a1,此时gcd(k1,k2)=1,因为如果k1和k2还有公约数t,那么此时x和a0的最大公约数就应该是t*a1而不是a1,同理对于b的也是类似,因此可以得到判断条件,也就是系数之间的最大公约数都是1。枚举k1并计算出k2判断是否合法,统计出数量。

#include<stdio.h>
#include<algorithm>
#include<math.h>
using namespace std;
int gcd(int x, int y) {
	return y == 0 ? x : gcd(y, x%y); // 一句话搞定   这个相当于要是x>y那么就换个位置
}

bool check(int x, int y) {
	if (gcd(x, y) == 1)return 1;
	return 0;
}

int main()
{
	int t, a0, a1, b0, b1;
	scanf("%d", &t);
	int cnt;
	while (t--) {
		scanf("%d%d%d%d", &a0, &a1, &b0, &b1);
		// 开始枚举
		cnt = 0;
		int mul_k = b1 / a1;
		//printf("mul_k=%d\n", mul_k);
		//printf("%d\n", int(sqrt(mul_k)));
		int x;
		// a1是公约数,b1是公倍数
		for (int now = 1; now<= sqrt(mul_k); now++) { // x=k1*a1=b1/k2 这里枚举的是k1(防止迭代变量变化,这里使用now作为迭代变量)
			int k = now;
			if (mul_k%k)continue;
			// 判断k时的情况
			x = k * a1; // 算出x
			if (x%a1 == 0 && b1 % x == 0) { // 满足倍数和约数
				if (check(a0 / a1, k) && check(b1 / b0, mul_k / k)) {
					cnt++;
				}
			}
			if (k*k == mul_k) continue;//重复的不用再算一次
			// 判断mul_k/k时的情况
			k = mul_k / k;
			x = k * a1; // 算出x
			if (x%a1==0 || b1 % x==0) { // 满足倍数和约数
				if (check(a0 / a1, k) && check(b1 / b0, mul_k / k)) {
					cnt++;
				}
			}
		}
		printf("%d\n", cnt);
	}
	return 0;
}

细胞分裂 

  [NOIP2009 普及组] 细胞分裂 - 洛谷       

  这一题需要计算的是一个数(细胞数)及其幂次是否可以为一个数(试管数)的倍数,涉及三个知识点。

  1. 一个大于2的数都可以分解为若干质数的乘积。
  2. 一个数是另一个数的倍数满足这个数的质数分解列表包含另一个数的质数分解列表。
  3. 幂次不改变质数列表的元素,只改变次数,假设m的分解包含t个x,那么m^n包含t*n哥x。

        那么这题的思路就很简单了,就是先分解试管数量,再逐个分解细胞数,一个个计算结果找出最小的。

#include<stdio.h>
#include<math.h>
#include<algorithm>
#define N 30000
using namespace std;
struct PipeNode {
	int num;
	int idx; // 当前质因数idx有num个
}pipeNode[N+20];
struct Flags {
	int num; 
	int x0; // 标记当前所属的初值(也就是每种细菌),每次分解质因数都要标记是属于哪种的,如果不匹配就是前面的,那么桶就不需要重复初始化
}flag[N+20]; // 下标就是质因数的数值
int n,m1,m2; // 细菌总数
int a[N+20];
int primes[N+1],prime_cnt;
int pipeCnt;// 试管质因数数量
bool check_prime(int x) {
	if (x % 2 == 0)return 0;
	for (int i = 3; i <= sqrt(x); i++) {
		if (x%i == 0)return 0;
	}
	return 1;
}

int main()
{
	scanf("%d", &n);
	scanf("%d%d", &m1, &m2);
	for (int i = 1; i <= n; i++)
		scanf("%d", a + i);
	// 质因数打表
	primes[++prime_cnt] = 2;
	for (int i = 3; i <= N + 10; i++) {
		if (check_prime(i))primes[++prime_cnt] = i;
	}
	// 首先给试管做质因数分解
	if (m1 == 1) {
		printf("0\n");//一个就是初始数量,肯定可以满足
		return 0;
	}
	else {
		for (int i = 1; i <= prime_cnt; i++) {// 枚举质因数
			if (m1%primes[i] == 0) { // 如果可以分解
				pipeNode[++pipeCnt].idx = primes[i];
				pipeNode[pipeCnt].num = 0;
				while (m1%primes[i] == 0) {
					pipeNode[pipeCnt].num++;
					m1 /= primes[i];
				}
			}
			if (m1 == 1)break;//分解结束
		}
	}
	for (int i = 1; i <= pipeCnt; i++)pipeNode[i].num *= m2;// 质因数*倍数
	// 开始检查每种细菌
	int ans = 0x3f3f3f3f;//存储需要再过的最短时间
	for (int index = 1; index <= n; index++) {
		int x0 = a[index];
		//printf("a[index]=%d\n", a[index]);
		// 分解x0并装进桶里
		int x0_copy = x0;
		for (int i = 1; i <= prime_cnt; i++) {
			if (x0_copy%primes[i] == 0) {
				flag[primes[i]].x0 = x0;
				flag[primes[i]].num = 0;
				while (x0_copy%primes[i] == 0) {
					flag[primes[i]].num++;
					x0_copy /= primes[i];
				}
			}
			if (x0_copy == 1)break;
		}
		// 检查当前细菌是否可以达到菌均分
		int res = -1; // 找最大值,存在不符合要求的就是-1
		for (int i = 1; i <= pipeCnt; i++){ // 检查所有菌
			int num = pipeNode[i].num;
			int idx = pipeNode[i].idx;
			if (flag[idx].x0 != x0) {//x0当前没有质因数分解到idx(试管的某个质因数)
				res = -1;
				break;
			}
			int flag_num = flag[idx].num; // 菌初始值
			// 计算需要多长时间
			int det = max(0,num - flag_num);
			if (det) {
				res = max(res,(det - 1) / flag_num + 1);
			}
			else {
				res = max(res,0);
			}
			if (res > ans)break;//没必要算了
		}
		if (res != -1) {
			ans = min(ans, res);
		}
		if (ans == 0)break;//不用算了
	}
	if (ans == 0x3f3f3f3f) {
		printf("-1\n");
	}
	else {
		printf("%d\n", ans+1); // 初始时间为1
	}
	return 0;
}

思维题

找筷子 

找筷子 - 洛谷

        这一题需要找到若干个数中,唯一的数量为奇数的那个数字,思路感觉比较巧妙,利用了异或的思路,因为一个数异或偶数次后为0,因此把全部数字取异或后就可以得到个数为奇数的那个数字。

        一个数异或两次就是0可以查一下异或的定义,两次为0,那么异或偶数次都是0。

#include<stdio.h>
int main()
{
	int a=0,n,x;
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) {
		scanf("%d", &x);
		a ^= x;// 取异或
	}
	printf("%d\n", a);
	return 0;
}

进制转换 

[NOIP2000 提高组] 进制转换 - 洛谷

        这一题涉及到了负进制的概念,比较新颖,一开始确实是没想到十进制数字转为负数进制的方法,后来查了一下,转为负进制也是使用短除法。

        类似转为二进制一直除以2,最后从余数逆向连起来得到结果,对于负二进制,也是除以-2,但是直接用C语言的'%'符号计算是会得到负余数的,比如除数为3,转为-2进制,(-3)÷(-2)=1...-1(1余-1),此时为了让余数为非负,把余数的一个被除数放到商,也就是(-3)÷(-2)=2...1,此时2*(-2)+1=-3,然后继续2÷(-2)=-1...0...一直到最后商为1或者为0,那么可以结束(这里一时忘记当时怎么想的了,0结束好理解,1结束应该是因为再除也是一样的结果?)。

        去掉前导0不要忘记。

#include<stdio.h>
int a,b;
int res[100000], cnt; 
int main()
{
	scanf("%d%d", &a, &b);
	int a_copy = a;
	while (a != 1 && a != 0) {
		int div = a / b;
		int mod = a % b;
		//printf("div=%d mod=%d\n", div, mod);
		if (mod < 0) {
			mod -= b;
			div++;
		}
		res[++cnt] = mod;
		a = div;
	}
	if(a) res[++cnt] = a; // 最后一位是1保存下来,0就不要了
	printf("%d=", a_copy);
	for (int i = cnt; i >=1; i--) {
		if(res[i]<=9)
			printf("%d", res[i]);
		else printf("%c", 'A' + res[i] - 10);
	}
	printf("(base%d)", b);
	return 0;
}

又是毕业季II

 又是毕业季II - 洛谷

        这一题要计算从n个数中任意取m(1≤m≤n)个数,分别对应的最大公约数。

        这一题的思路有点巧妙,当然不是我想到的...

        m越大,最大公约数越小,也就是选的越多,那么最大公约数一定越小(如果m个对应了更大的最大公约数,那么m-1个也能满足取得这个最大公约数,那么就矛盾了)。首先计算出每个数的所有因子(不是质因子),并给这些因子计数,然后从后往前看(后也就是公因数可能的最大值,也就是max(a[1~n]),也就是m=1对应的最大公约数),要是某个数字作为因子的个数恰好为m个,那么就是任选m个数字对应的最大公因数(这m个数就是对应此时最大公约数的选择方案,可以细品一下)

#include<stdio.h>
#include<algorithm>
#include<math.h>
using namespace std;
#define N 1000000
int n;
int flag[N + 10];
int main()
{
	scanf("%d", &n);
	int x;
	int maxx = -1;
	for (int i = 1; i <= n; i++) {
		scanf("%d", &x);
		maxx = max(x, maxx);
		// 分解所有质因数,存入flag
		for (int j = 1; j < sqrt(x); j++) {
			if (x%j == 0) {
				flag[j]++;
				flag[x / j]++;
			}
		}
		int sqrt_x = sqrt(x); // 特判
		if (pow(sqrt_x,2) == x) {
			flag[sqrt_x]++;
		}
	}
	for (int i = 1; i <= n; i++) {
		while (flag[maxx] < i)maxx--;
		printf("%d\n", maxx); // 打印当前位置
	}
	return 0;
}

        这个题单其实还有一些没写,确实有点超出理解水平了,先记录到这里。

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

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

相关文章

远程桌面时连接不上远程计算机是什么问题

在服务器上搭建网络程序时&#xff0c;我们经常会有需要远程连接上服务器进行相关操作&#xff0c;有些用户在远程桌面的时候&#xff0c;有时会有遇上无法连接到远程计算机的情况。 很多用户都曾遇到在远程桌面时出现“未启用对服务器的远程访问”、“远程计算机已关闭”、“…

AIGC技术讲解以及应用的落地

简介 近期&#xff0c;火爆的“AI绘画”、图片转AI图&#xff0c;智能聊天软件ChatGPT&#xff0c;引起了人们广泛关注。人工智能潜力再次被证明&#xff0c;而这三个概念均来自同一个领域&#xff1a;AIGC。AIGC到底是什么&#xff1f;为什么如此引人关注&#xff1f;AIGC能产…

代码生成器(新):mybatis-plus-generator使用指南

代码生成器&#xff08;新&#xff09;官网 后端代码&#xff1a;点击查看 LearnElementUiAndSpringBoot 提醒&#xff1a;LearnElementUiAndSpringBoot下载完后&#xff0c;在运行调试 Main.java里的main方法之前&#xff0c;除了utils包和Main.java文件&#xff0c;其他包需…

rac二节点实例redo故障无法启动修复

问题描述 节点二由于redo故障问题无法正常启动 目前节点二为mount状态&#xff0c;open报错。alter database open ERROR at line 1: ORA-00322: log 28 of thread 2 is not current copy ORA-00312 查询v$log视图发现节点二的redo log组没有状态为current的日志组。大概…

今年过年都有哪些方式?其中又有什么商机

古往今来&#xff0c;春节都是十分重要的节日&#xff0c;它承载着家庭团聚、祭祖祈福的重要意义&#xff0c;然而在今年&#xff0c;年轻人过年的方式不那么传统&#xff0c;今天媒介盒子就来和大家聊聊&#xff1a;今年过年都有哪些方式&#xff1f;其中又有什么商机。 一、 …

电商服务类指标分析(3)——用户反馈模块指标

前段时间做了一个电商服务类项目&#xff0c;与业务一起梳理了部分指标&#xff0c;这些指标便于了解电商服务&#xff0c;现在做一个整理和回顾。 电商服务类指标可以分为五大类&#xff0c;涵盖了服务从售前、履约、售后、用户反馈、监控预警这样一条链路的内容。 本篇文章来…

大数据知识图谱之深度学习——基于BERT+LSTM+CRF深度学习识别模型医疗知识图谱问答可视化系统

文章目录 大数据知识图谱之深度学习——基于BERTLSTMCRF深度学习识别模型医疗知识图谱问答可视化系统一、项目概述二、系统实现基本流程三、项目工具所用的版本号四、所需要软件的安装和使用五、开发技术简介Django技术介绍Neo4j数据库Bootstrap4框架Echarts简介Navicat Premiu…

实习日志13

1.早上试了一下社区里的东西 1.1.插件&#xff0c;可交互页面 垃圾插件&#xff0c;显示的html不支持我的html&#xff0c;js都加载不出来 1.2.插件&#xff0c;文件上传 硬件给的是用websocket交互的&#xff0c;没有文件下载接口 2.打算自己搞了&#xff0c;试试用cooki…

360,这次你真行:流氓耍到外国佬身上,凌晨1点让我笑岔气

天下&#xff0c;苦流氓软件久矣 在数字世界中&#xff0c;我们常常遭遇一些令人头疼的问题&#xff0c;其中尤以大厂软件的牛皮癣特性为甚。这些软件不仅捆绑安装广告推广&#xff0c;而且手段无所不用其极&#xff0c;让用户感到无可奈何。 在此&#xff0c;我不得不提及四…

Linux内存管理:(十二)Linux 5.0内核新增的反碎片优化

文章说明&#xff1a; Linux内核版本&#xff1a;5.0 架构&#xff1a;ARM64 参考资料及图片来源&#xff1a;《奔跑吧Linux内核》 Linux 5.0内核源码注释仓库地址&#xff1a; zhangzihengya/LinuxSourceCode_v5.0_study (github.com) 外碎片化发生时&#xff0c;页面分配…

2024年全球手机市场复苏 传音打响出海品牌进阶之战

2024年智能手机将迎来新一轮“增长季”。根据市场研究机构TechInsights的最新预测&#xff0c;2024年全球智能手机市场将恢复低个位数的增长。对广大手机厂商来说&#xff0c;这无疑是个好消息&#xff0c;但如何在逐渐回暖却竞争激烈的市场中站稳脚跟就需要他们“各显神通”了…

【Java EE】----Spring框架创建和使用

1.Spring框架创建 创建一个maven项目 添加Spring框架支持 <dependencies> 上下文<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.3.RELEASE</version></depende…

云打印服务未启动是什么情况?云打印服务未启动怎么解决?

随着互联网技术的发展&#xff0c;很多“云概念”也开始火热起来。这其中&#xff0c;最适合办公人群和学生人群的“云打印”概念也受到了追捧。目前市场上提供的云打印服务有很多&#xff0c;但是最近出现了较多云打印服务的问题。那么今天小易就带大家来了解一下&#xff0c;…

机器视觉系统设计:视觉系统中的成像基准

开发视觉系统的一个重要活动是验证其部署是否符合工程规范。一个成功的视觉应用程序的两个特点是它无需工程师干涉情况下正常工作了多长时间&#xff0c;以及它的维护和复制部署是多么简易。实现所有如上所述目标的一个关键步骤是确定视觉系统的基准。 在这里使用的上下文中&a…

LeetCode_19_中等_删除链表的倒数第N个结点

文章目录 1. 题目2. 思路及代码实现&#xff08;Python&#xff09;2.1 计算链表长度2.2 栈 1. 题目 给你一个链表&#xff0c;删除链表的倒数第 n n n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a; h e a d [ 1 , 2 , 3 , 4 , 5 ] , n…

Stable Diffusion 模型下载:RealCartoon-Anime - V10

文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十 下载地址 模型介绍 这个检查点是从 RealCartoon3D 检查点分支出来的。它的目标是产生更多的“动漫”风格&#xff0c;因为我喜欢动漫。:)我知道有很多人做得很好&#xff08;比如aniw…

背景样式de七七八八

一&#xff0c;简介 背景属性可以设置背景颜色、背景图片、背景平铺、背景图片位置、背景图像固定等。 1.1背景颜色&#xff08;background-color&#xff09; background-color&#xff1a;transparent/color&#xff1b; 默认值为transparent&#xff08;透明的&#xff…

2024 RTE行业(实时互动行业)人才发展学习总结

解决方案 人才画像 开发者人才素质要求&#xff1a; 具备多个领域的技术知识注重团队合作&#xff0c;具备协作能力以用户为导向的用户体验意识具备创新思维和解决问题的能力需快速响应行业变化和持续的学习能力具备项目管理能力 学习和吸收新知识的渠道 RTE人才分类

Linux实验记录:使用BIND提供域名解析服务

前言&#xff1a; 本文是一篇关于Linux系统初学者的实验记录。 参考书籍&#xff1a;《Linux就该这么学》 实验环境&#xff1a; VmwareWorkStation 17——虚拟机软件 RedHatEnterpriseLinux[RHEL]8——红帽操作系统 备注&#xff1a; 为了降低用户访问网络资源的门槛&am…

SpringMVC速成(一)

文章目录 SpringMVC速成&#xff08;一&#xff09;1.SpringMVC概述2.SpringMVC入门案例2.1 需求分析2.2 案例制作步骤1:创建Maven项目步骤2:补全目录结构步骤3:导入jar包步骤4:创建配置类步骤5:创建Controller类步骤6:使用配置类替换web.xml步骤7:配置Tomcat环境步骤8:启动运行…