【算法每日一练]-数论 (保姆级教程 篇2 )#行列式 #甜甜花研究 #约数个数 #模数 #数树 #盒子与球

news2024/10/5 17:12:17

目录

今日知识点:

辗转相减法化下三角求行列式

组合数动态规划打表

约数个数等于质因数的次方+1的乘积

求一个模数

将n个不同的球放入r个不同的盒子:f[i][j]=f[i-1][j-1]+f[i-1][j]*j

行列式 

甜甜花的研究 

约数个数

模数 

数树 

盒子与球 


        

        

行列式 

给出一个矩阵求 行列式。

输入:  
1
3
1 -2 -1
0 3 2
3 1 -1

思路:

不能直接乘上上面行的倍数来消除本行对应元素。试试辗转相减法把。

(1,3)减去2倍(0,1)->(1,0)

(5,3)减去0倍(3,5)减去1倍(2,3)减去1倍(1,2)减去2倍(0,1)->(1,0)

然后每次检查上面行的元素是否为0,然后换回来就行了

#include <bits/stdc++.h>
using namespace std;
const int mod=0x1f1f1f1f;
typedef long long ll;
ll t,n,a[10][10];
ll solve(){//计算行列式,化简成下三角型(有点类似辗转相除法)
	ll res=1,w=1;//res是结果,w是符号
	for(int i=1;i<=n;i++){//对[i][i]元素所在的列处理
		for(int j=i+1;j<=n;j++){
//我们每次都让下面的行减去上面行的a[j][i]/a[i][i]倍,然后再让最小的行放到上面判断是不是[i][i]是不是0,如果不是就继续。
			while(a[i][i]){
				ll di=a[j][i]/a[i][i];
				for(int k=i;k<=n;k++){
					a[j][k]=(a[j][k]-di*a[i][k]%mod+mod)%mod;//有负数的话要加一次mod
				}
				swap(a[i],a[j]);
				w=-w;
			}
			swap(a[i],a[j]);
			w=-w;
		}
	}
		for(int i=1;i<=n;i++)
			res=a[i][i]*res%mod;
		res=w*res;
		return (res+mod)%mod;	
}

int main(){
	cin>>t;
	while(t--){
		cin>>n;
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)
			cin>>a[i][j];
		cout<<solve()<<'\n';
	}	
}

        

        

甜甜花的研究 

有n个各不相同的甜甜花种子,现在雇佣了m个人,每人能照顾ai个花。问一共多少种分配方法把花分出去。(数据保证种子有剩余)

输入           输出:20(结果对12520取模)
5 2
3 1

思路:

因为种子一定有剩余。那么第一个人可以有C(a1,n)种分法,第二个人有C(a2,n)种分法……

乘起来就完事了。主要是数据很大,直接一个个硬算不划算。直接上公式:

C(m,n)=C(m-1,n-1)+C(m-1,n);

记忆:每个人都有两种状态要么是被选到要么未被选到。C(m-1,n-1)对应被选到的情况数,C(m-1,n)对应未被选到的情况数

然后利用动态规划打表就会非常快了。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,m,num,ans=1;
ll a[10007][107];

int main(){
	cin>>n>>m;
	a[0][0]=1;
	for(int i=1;i<=10000;i++){//利用动态规划求组合数[i][j]=[i-1][j-1]+[i-1][j]
		a[i][0]=1;
		for(int j=1;j<=100;j++){
			a[i][j]=(a[i-1][j-1]+a[i-1][j])%12520;
		}
	}
	for(int i=1;i<=m;i++){
		cin>>num;
		ans=ans*a[n][num]%12520;
		n-=num;
	}
	cout<<ans;
}

      

        

约数个数

求n的约数个数。

#include <bits/stdc++.h>
using namespace std;
int main(){方法一:直接找就完了,约数一定成对出现,但是相等时候要特判一下
	int n,ans=0;cin>>n;
	for(int i=1;i*i<=n;i++){
		if(n%i==0)ans+=2;
		if(i*i==n)ans--;
	}
	cout<<ans;
}
//
//int main(){ //方法二:约数等于质因数的次方加1的乘积
//	int n,ans=1;cin>>n;
//	for(int i=2;i*i<=n;i++){
//		int tmp=0;
//		while(n%i==0){
//			tmp++;n/=i;//求质因数的次数
//		}
//		ans*=(tmp+1);
//	}
//	if(n!=1)ans*=2;//最后的质因数也不要忘了
//	cout<<ans;
//}

           

        

模数 

输入a,b问有多少个x使得a%x==b。如果有无穷多个输出infinity,不存在输出0。

思路:

首先分析一下,a%x==b,等价于找a-b的因数(约数)个数。但是先等等:这个因数还必须满足比余数大

#include <bits/stdc++.h>
using namespace std;

int run(int a,int b){
	int ans=1;
	for(int i=2;i*i<=a;i++){
		if(i<=b||a/i<=b)continue;
		int tmp=0;
		while(a%i==0){//判断是不是质因数
			tmp++;a/=i;//一边缩小a
		}
		ans*=(tmp+1);
	}
	if(a!=1)ans*=2;
	return ans;
}

int main(){
	int a,b;
	cin>>a>>b;
	if(a==b){
		cout<<"infinity";
		return 0;	
	}
	if(a<b){
		cout<<0;return 0;
	}
	cout<<run(a-b,b);
	
}

         

        

数树 

思路:

反正就是不能出现其他组的倍数这种情况。 可以直接上筛子,提前把不成立给筛掉,不过有点麻烦。

仔细观察不难你会发现:

只要(a,b)的最大公约数不是1,那么就一定不是答案。然后统计就行了

#include <bits/stdc++.h>
using namespace std;
int c,n;

int gcd(int a,int b){//辗转相除法(36,14)(14,8)(8,6)(6,2)(2,0)->2
	return b==0?a:gcd(b,a%b);//(25,14)(14,11)(11,3)(3,2)(2,1)(1,0)->1
}

int main(){
	cin>>c;
	for(int i=1;i<=c;i++){
		cin>>n;
		int ans=0;
		for(int j=1;j<=n;j++)
			for(int k=1;k<=n;k++){
				if(gcd(j,k)==1)ans++;
			}
		cout<<i<<" "<<n<<" "<<ans+2<<'\n';
	}
}
/*
4
2
4
5
231
*/

        

         

盒子与球 

现有r个互不相同的盒子和n个互不相同的球,要将这n个球放入r个盒子中,且不允许有空盒子,一共有多少种放法?

思路:

主要是状态转移式子。f[i][j]=f[i-1][j-1]+f[i-1][j]*j;

我们设置f[i][j]表示i个球j个盒子的放法。那么对于第i个球,要么自己一个盒子f[i-1][j-1]情况数,要么和别人一个盒子但是有j中选择f[i-1][j]*j种情况数。不断递推就行了

#include <bits/stdc++.h>
using namespace std;
int n,r,f[20][20],ans;

int main(){
	cin>>n>>r;
	f[0][0]=1;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=min(i,r);j++){
			f[i][j]=f[i-1][j-1]+f[i-1][j]*j;
		}
	}
	ans=f[n][r];
	for(int i=1;i<=r;i++){
		ans*=i;
	}
	cout<<ans;
}
/*
3 2
6*/

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

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

相关文章

【刷题日志】深度理解除(/)与取模(%)附水仙花数以及变种水仙花数题解

文章目录 &#x1f680;前言&#x1f680;除与取模&#x1f680;水仙花数&#x1f680;变种水仙花数 &#x1f680;前言 本专栏文章都直奔刷题主题&#xff0c;阿辉都不会在废话了&#xff0c;加油&#xff0c;少年&#xff01;&#xff01;&#xff01; &#x1f680;除与取…

《MySQL系列-InnoDB引擎03》MySQL文件相关介绍

文章目录 第三章 文件1 参数文件1.1 什么是参数&#xff1f;1.2 参数类型 2 日志文件2.1 错误日志2.2 慢查询日志2.2x 慢查询日志拓展-如何开启MySQL慢查询日志&#xff1f;2.2XX 慢查询日志拓展-mysqldumpslow日志分析工具2.3 查询日志2.4 二进制日志 3 套接字文件4 PID文件5 …

使用ros2 launch启动gazebo时,可以设置的sdf文件名称

事实证明&#xff1a;这个文件夹里面的名称都可以设置/usr/share/gz/gz-sim8/worlds 并且不用指定文件夹路径&#xff0c;可以直接输入文件名。当然也可以完全指定路径&#xff1a;

梳理Langchain-Chatchat-UI接口文档

在 Langchain-Chatchat v0.1.17 版本及以前是有前后端分离的 Vue 项目的&#xff0c;但是 v0.2.0 后就没有了。所以本文使用的是 Langchain-Chatchat v0.1.17 版本中的 Vue 项目。经过一番折腾终于将 Langchain-Chatchat v0.1.17 版本前端 Vue 接口和 Langchain-Chatchat v0.2.…

使用MQTT.JS创建一个网页版的MQTT客户端

一、MQTT.JS介绍 MQTT.js 是一个开源的 MQTT 协议的客户端库&#xff0c;使用 JavaScript 编写&#xff0c;主要用于 Node.js 和 浏览器环境中。是JavaScript 环境下的 MQTT 客户端库。可以用于微信小程序、支付宝小程序等定制浏览器环境。 我们可以直接在HTML文件中进行调用…

计算字符串的长度几种方法 | 递归 | 指针减指针 | 计数器 | C语言 | 详解 | 期末考试必看!!!

一&#xff0c;使用 递归 计算 字符串 的 长度 1&#xff0c;题目描述 2&#xff0c;分析题目 Ⅰ&#xff0c;题目中要求除了函数的形参&#xff0c;函数中不能够使用多余的变量&#xff08;这是比较苛刻的要求&#xff09;。 Ⅱ&#xff0c;根据此&#xff0c;很自然的…

C++正则表达式全攻略:从基础到高级应用

C正则表达式全攻略&#xff1a;从基础到高级应用 一、基础知识二、正则表达式的基本匹配三、C中使用正则表达式四、高级正则表达式五、实践示例六、性能优化6.1、编译正则表达式6.2、避免过度使用回溯6.3、优化匹配算法 七、总结 一、基础知识 正则表达式是一种用于匹配、搜索…

C#【必备技能篇】cmd重定向

文章目录 一、实现目的二、工程1&#xff1a;Test.cs代码三、工程2&#xff1a;MainConsoleApp.cs代码四、测试结果 一、实现目的 通过MainConsoleApp.exe向Test.exe中输入参数&#xff0c;并将结果返回到MainConsoleApp.exe 二、工程1&#xff1a;Test.cs代码 using System…

机器学习-生存分析:如何基于随机生存森林训练乳腺癌风险评估模型?

一、 引言 乳腺癌是女性最常见的恶性肿瘤之一&#xff0c;也是全球范围内女性死亡率最高的癌症之一。据统计&#xff0c;每年全球有超过200万人被诊断为乳腺癌&#xff0c;其中约60万人死于该疾病。因此&#xff0c;乳腺癌的早期诊断和风险评估对于预防和治疗乳腺癌具有非常重要…

计算机毕业论文内容参考|基于Java的超市管理系统的设计与实现

文章目录 摘要:前言绪论1课题背景2国内外现状与趋势3课题内容相关技术与方法介绍系统分析系统设计系统实现系统测试总结与展望后续工作展望摘要: 本文详细介绍了基于Java的超市管理系统的设计与实现。该系统采用Java语言和常用的开发框架,实现了超市的进货、销售、库存等日…

[Flutter]WindowsOS中相关配置

Flutter项目在Windows平台上如何配置 目录 Flutter项目在Windows平台上如何配置 写在开头 正文 1、OS准备 2、编译环境准备 ① 下载AndroidStudio ② 下载dart ③ 下载flutter ④ 下载并安装VS ⑤ 在AS中配置dart和flutter 3、配置中遇到的问题 写在结尾 写在开头…

2024年编程学习规划:掌握编程技能的最佳路线

如果大家感感兴趣也可以去看&#xff1a; &#x1f389;博客主页&#xff1a;阿猫的故乡 &#x1f389;系列专栏&#xff1a;JavaScript专题栏 &#x1f389;ajax专栏&#xff1a;ajax知识点 &#x1f389;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 文章…

经典卷积神经网络-VGGNet

经典卷积神经网络-VGGNet 一、背景介绍 VGG是Oxford的Visual Geometry Group的组提出的。该网络是在ILSVRC 2014上的相关工作&#xff0c;主要工作是证明了增加网络的深度能够在一定程度上影响网络最终的性能。VGG有两种结构&#xff0c;分别是VGG16和VGG19&#xff0c;两者并…

JRT代码结构调整和示例

之前一直没建表专门使用ORM的api&#xff0c;做模板设计器需要建表&#xff0c;就一边开发设计器一般测试和调整ORM的api&#xff0c;只有做业务才能知道哪些api使用别扭&#xff0c;写了设计器之后改进了ORM的api以方便业务操作数据库。新写法差不多是ORM操作数据库的稳定api了…

【jmeter】将上一个请求的结果作为下一个请求的参数

1、简介 ApacheJMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试&#xff0c;它最初被设计用于Web应用测试但后来扩展到其他测试领域。它可以用于测试静态和动态资源例如静态文件、Java小服务程序、CGI脚本、Java对象、数据库&#xff0c;FTP服务器&…

Think-on-Graph—基于知识图谱的LLM推理

文章目录 背景动机LLM模型存在的问题LLM ⊕ \oplus ⊕KG范式的局限性 LLM ⊗ \otimes ⊗KG范式&#xff08;Think on Graph&#xff0c;ToG&#xff09;LLM ⊗ \otimes ⊗KG范式的过程ToG的三个阶段初始化实体提取关系及实体探索推理 例子及效果相关结论搜索深度和波束宽度对To…

Centos安装Kafka(KRaft模式)

1. KRaft引入 Kafka是一种高吞吐量的分布式发布订阅消息系统&#xff0c;它可以处理消费者在网站中的所有动作流数据。其核心组件包含Producer、Broker、Consumer&#xff0c;以及依赖的Zookeeper集群。其中Zookeeper集群是Kafka用来负责集群元数据的管理、控制器的选举等。 由…

大模型通向AGI,腾讯云携手业界专家探索创新应用新风向

引言 一年过去&#xff0c;ChatGPT 引发的 AGI 热潮丝毫未减。只是相对于最初推出时掀起的全民大模型热&#xff0c;如今关于该如何落地的讨论更多了起来。 随着算力、数据库、大数据等底层技术的发展&#xff0c;大模型的建设与在各个领域的应用正在加速推进&#xff0c;那么…

SaleSmartly获得了Meta Business Partners认证徽章

近日&#xff0c;SaleSmartly通过了社交网络服务巨头Meta在消息领域的Business Partners认证&#xff0c;这项权威且重要的认证进一步证实了SaleSmartly在消息管理领域的卓越实力和卓越成果。 Meta是一家美国互联网公司&#xff0c;旗下拥有Facebook、Instagram、WhatsApp等社交…

YOLOv8改进 | 注意力篇 | ACmix自注意力与卷积混合模型(提高FPS+检测效率)

一、本文介绍 本文给大家带来的改进机制是ACmix自注意力机制的改进版本&#xff0c;它的核心思想是&#xff0c;传统卷积操作和自注意力模块的大部分计算都可以通过1x1的卷积来实现。ACmix首先使用1x1卷积对输入特征图进行投影&#xff0c;生成一组中间特征&#xff0c;然后根…