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

目录

今日知识点:

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

组合数动态规划打表

约数个数等于质因数的次方+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)->2return 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.hqwc.cn/news/316180.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第一个Qt程序----Hellow word!

从今天起就开始我们的第一个Qt小程序&#xff0c;点击New Project后点击右侧的Application后点击Qt Widgets Application。Qt Widgets 模块提供了一组UI元素用于创建经典的桌面风格的用户界面&#xff0c;Widgets是小部件的意思&#xff0c;也可以称为控件&#xff0c;因此Qt …

高效视频剪辑:批量修改视频尺寸的技巧与步骤

随着社交媒体的兴起&#xff0c;视频已然是分享和交流的重要方式。但有时&#xff0c;要的视频尺寸并不总是符合需求。这就要对视频进行剪辑和调整。现在探讨一种高效的方法&#xff0c;可以批量修改视频尺寸&#xff0c;简化工作流程。现在一起来看看云炫AI智剪如何批量修改视…

Redis - 挖矿病毒 db0 库 backup 反复出现解决方案

问题描述 腾讯云的服务器&#xff0c;使用 Docker 部署了 Redis 之后&#xff0c;发现 DB0 中总是出现 4 条 key&#xff0c;分别是 backup01backup02backup03backup04 而自己每次存入 db0 中的数据过一会就会被无缘无故删除掉。 原因分析 挖矿病毒 解决方案 在启动的时候…

Zookeeper-Zookeeper分布式一致性协议ZAB源码解析

整个Zookeeper就是一个多节点分布式一致性算法的实现&#xff0c;底层采用的实现协议是ZAB。 ZAB协议介绍 ZAB 协议全称&#xff1a;Zookeeper Atomic Broadcast&#xff08;Zookeeper 原子广播协议&#xff09;。 Zookeeper 是一个为分布式应用提供高效且可靠的分布式协调服…

IOS - 手机安装包 ipa 常见几种方式

安装 ipa 包的方法有很多中&#xff0c;可以通过不同的软件安装&#xff0c;本文只列出了常用的几种&#xff0c;做个简单的归纳整理 1、iTunes 安装 数据线连接手机之后&#xff0c;会自动连接iTunes&#xff0c;&#xff08;第一次连接的时候会提示是否信任此电脑&#xff0…

Clojure 实战(4):编写 Hadoop MapReduce 脚本

Hadoop简介 众所周知&#xff0c;我们已经进入了大数据时代&#xff0c;每天都有PB级的数据需要处理、分析&#xff0c;从中提取出有用的信息。Hadoop就是这一时代背景下的产物。它是Apache基金会下的开源项目&#xff0c;受Google两篇论文的启发&#xff0c;采用分布式的文件…

Open3D 最小二乘拟合平面——拉格朗日乘子法

目录 一、算法原理二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接Open3D 最小二乘拟合平面——拉格朗日乘子法。爬虫自重。 一、算法原理 设拟合出的平面方程为: a x + b y +

WeNet语音识别+Qwen-72B-Chat Bot+Sambert-Hifigan语音合成

WeNet语音识别Qwen-72B-Chat Bot&#x1f47e;Sambert-Hifigan语音合成 简介 利用 WeNet 进行语音识别&#xff0c;使用户能够通过语音输入与系统进行交互。接着&#xff0c;Qwen-72B-Chat Bot作为聊天机器人接收用户的语音输入或文本输入&#xff0c;提供响应并与用户进行对话…

OS 7--DNS配置+Apache发布网站

环境准备 centOS 7 1.配置DNS 1.1 域名为lianxi.com 1.2 为WWW服务器、FTP服务器、NEWS服务器做域名解析 1)安装DNS yum -y install bind bind-utils (如果安装不上&#xff0c;就把磁盘在重洗挂载一下&#xff09; 2&#xff09;修改DNS配置文件 vim /etc/resolv.conf…

java spring boot 获取resource目录下的文档

主要代码 String filePath"templates/test.xls" ClassPathResource classPathResource new ClassPathResource(filePath); InputStream inputStream classPathResource.getInputStream();目录 主要目录存放再这 代码案例 public void downloadTemplate( HttpS…

深度生成模型之GAN的评估 ->(个人学习记录笔记)

文章目录 深度生成模型之GAN的评估图像翻译的应用1. 风格迁移2. 数据增强3. 经典图像任务4. 内容创作5. 人脸图像编辑6. 人体图像编辑 图像翻译模型1. 有监督图像翻译模型2. 无监督图像翻译模型3. 多域图像翻译模型 深度生成模型之GAN的评估 图像翻译的应用 1. 风格迁移 各类…

【docker实战】安装tomcat并连接mysql数据库

本节用docker来安装tomcat&#xff0c;并用这个tomcat连接我们上一节安装好的mysql数据库 一、拉取镜像 我们安装8.5.69版本 先搜索一下 [rootlocalhost ~]# docker search tomcat NAME DESCRIPTION …