【算法每日一练]

 目录

今日知识点:

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

组合数动态规划打表

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

求一个模数

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

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

行列式 

甜甜花的研究 

约数个数

模数 

数树 

盒子与球 

 数的划分 


        

        

        

行列式 

给出一个矩阵求 行列式。

输入:  
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(n,a1)种分法,第二个人有C(n-a1,a2)种分法……

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

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

记忆:每个人都有两种状态要么是被选到要么未被选到。C(n-1,m-1)对应被选到的情况数,也就是内定该人然后去选m-1个;C(n-1,m)对应未被选到的情况数,也就是直接忽略该人然后去选m个。

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

#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;

(这个公式非常类似组合公式C(n,m)=C(n-1,m-1)+C(n-1,m),因为两者的原理相同)

我们设置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*/

        

        

 数的划分 

思路:

两种做法:

第一种:动态规划:

题目可以理解成把n个相同球放入k个相同盒子,然后因为球都是相同的,就不能再对最后一个球进行讨论了。应该对应一类球:

设置a[i][j]表示i个球放入j个盒子的方案数。

第一种情况:有一个盒子只有一个球,那么就对应了a[i-1][j]

第二种情况:每个盒子都至少有两个球,那么就对应看a[i-j][j]

所以:a[i][j]=a[i-j][j]+a[i-1][j-1]

第二种:dfs:

在已经放了i时候,每次可以放1~n-i个,所有dfs(i)有n-i个分支,这个复杂度很高,别着急,只需要把无效分支剔除即可很快。

仔细观察7的拆法:

1 1 5

1 2 4

1 3 3

2 2 3

2 3 2(重复了哟)

所以你发现了,要想不重复 ,就必须后面选的数比前面的大。所以在dfs(i)也就是选了i的时候,后面选的数都必须比i大,那么有了sum+i*(k-cnt)<=n这个分支优化。可以理解成是一共1组,且组内单增即可。

dfs的速度就变快了很多。

#include <bits/stdc++.h>
using namespace std;
int n,k,ans=0,a[205][70];
//int main(){//解法一:动态规划
//	cin>>n>>k;
//	for(int i=1;i<=n;i++)a[i][1]=1;
//	for(int i=2;i<=n;i++)
//		for(int j=2;j<=(i,k);j++){
//			a[i][j]=a[i-1][j-1];
//			if(i>=2*j)a[i][j]+=a[i-j][j];
//		}
//	cout<<a[n][k];
//}
//解法二:dfs+优化
void dfs(int cnt,int up,int sum){//cnt是已选个数,up已选数的最大值,sum是总和if(cnt==k){if(sum==n)ans++;return ;}for(int i=up;sum+i*(k-cnt)<=n;i++){//下一个点必须比当前点大dfs(cnt+1,i,sum+i);//选下一个数}
}
int main(){cin>>n>>k;dfs(0,1,0);cout<<ans;
}

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

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

相关文章

高架学习笔记之需求工程

目录 一、什么是软件需求 二、需求工程 2.1. 需求获取 2.2. 需求分析 2.3. 形成需求规格 2.4. 需求确认 2.5. 需求管理 2.5.1. 变更控制 2.5.2. 版本控制 2.5.3. 需求跟踪 2.5.4. 需求状态跟踪 一、什么是软件需求 软件需求目前没有统一的定义&#xff0c;一般是指用…

Vue3:直接对一个响应式对象数据进行结构复制会丢失响应式效果

一、问题描述 我们在进行路由页面传参的时候&#xff0c;使用query方式传递数据 这个时候&#xff0c;接收数据的组件&#xff0c;会从useRoute的query属性里面获取数据 如果&#xff0c;这里使用结构赋值语法&#xff0c;那么&#xff0c;获取到的数据&#xff0c;会失去响应…

手写一个LRU

import java.util.LinkedHashMap; import java.util.Map;public class LRUCache<K, V> extends LinkedHashMap<K, V> {private final int cacheSize;public LRUCache(int cacheSize) {// 设置访问顺序为访问顺序&#xff0c;即最近访问的元素将被放置在队列尾部sup…

从零开始学HCIA之网络基础知识01

1、20世纪70年代末&#xff0c;为了打破不同厂商设备之间无法相互通信的界限&#xff0c;ISO&#xff08;International Organization for Standardization&#xff0c;国际标准化组织&#xff09;开发了OSI参考模型&#xff08;Open System Interconnection Reference Model&a…

树的遍历方式DFS和BFS

DFS(depth first search) 深度优先遍历 从图中一个未访问的顶点V开始&#xff0c;沿着一条路一直走到底&#xff0c;然后从这条路尽头的节点回退到上一个节点&#xff0c;再从另一条路走到底…不断递归重复这个过程&#xff0c;直到所有的顶点都遍历完成。前序遍历&#xff0c…

前端框架前置课(1)---AJAX阶段

1. AJAX入门 1.1 AJAX概念和axios使用 1.1.1 什么是AJAX? 1.1.2 怎么用AJAX? 引入axios.js 获取省份列表数据 1.2 认识URL 1.3 URL查询参数 1.4 常用请求方和数据提交 1.5 HTTP协议-报文 1.5.1 HTTP响应状态码 1.5.1.1 状态码&#xff1a;1XX&#xff08;信息&#xff09…

字母在字符串中的百分比

字母在字符串中的百分比 链接:https://leetcode.cn/problems/percentage-of-letter-in-string/description/ 给你⼀个字符串 s 和⼀个字符 letter &#xff0c;返回在 s 中等于 letter 字符所占的 百分比 &#xff0c;向下取整到最接近的百分比。 输⼊&#xff1a;s “foob…

sox命令用法

play input.wav 播放音频 sox input.wav -n stat 查看音频文件信息 soxi input.wav 查看音频文件信息input sox input.wav -n stat -v 不失真最大调整量 sox -v 0.8 input.wav output.wav 调整音量0.8,&#xff08;大于1为扩大&#xff0c;小于1为缩小&#xff09; sox *.wav *…

用最小堆实现通用的高效定时器组件

用最小堆实现通用的高效定时器组件 文章目录 用最小堆实现通用的高效定时器组件开篇解决方案类图源码实现测试总结 开篇 在程序开发过程中&#xff0c;定时器会经常被使用到。而在Linux应用开发中&#xff0c;系统定时器资源有限&#xff0c;进程可创建的定时器数量会受到系统限…

力扣爆刷第103天之CodeTop100五连刷1-5

力扣爆刷第103天之CodeTop100五连刷1-5 文章目录 力扣爆刷第103天之CodeTop100五连刷1-5一、3. 无重复字符的最长子串二、206. 反转链表三、146. LRU 缓存四、215. 数组中的第K个最大元素五、25. K 个一组翻转链表 一、3. 无重复字符的最长子串 题目链接&#xff1a;https://l…

计算机软件安全

一、软件安全涉及的范围 1.1软件本身的安全保密 软件的本质与特征&#xff1a; 可移植性 寄生性 再生性 可激发性 攻击性 破坏性 …… 知识产权与软件盗版 软件商品交易形式不透明&#xff0c;方式多样&#xff0c;传统商标标识方法不适用&#xff1b; 盗版方法简捷…

SFML udp通信实例

包含的lib库文件&#xff0c;免得一个一个复制名称&#xff1a; sfml-window-d.lib sfml-system-d.lib sfml-audio-d.lib sfml-graphics-d.lib sfml-main-d.lib sfml-network-d.lib vorbis.lib vorbisenc.lib vorbisfile.lib void runUdpClient(unsigned short port) { /…

【Nginx】配置Nginx以支持主域名和二级域名

生命就像是一场告别 从起点对一切说再见 你拥有的仅仅是伤痕 在回望来路的时候 那天我们相遇在街上 彼此寒暄并报以微笑 我们相互拥抱挥手道别 转过身后已泪流满面 &#x1f3b5; 蔡健雅《当我想你的时候》 Nginx是一款高性能的Web服务器和反向代理服务器…

springboot/ssm本科生交流培养管理平台Java高校课程选课系统web

springboot/ssm本科生交流培养管理平台Java高校课程选课系统web 基于springboot(可改ssm)vue项目 开发语言&#xff1a;Java 框架&#xff1a;springboot/可改ssm vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1…

我的风采——android studio

目录 实现“我的风采”页面要求理论代码生成apk文件 实现“我的风采”页面 要求 要求利用’java框架的边框布局实现“找的风采 ”页而&#xff0c;其中中间为你的生活照&#xff0c;左右和下面为按钮&#xff0c;上面为标签 理论 Java GUI编程是Java程序设计的重要组成部分…

浩哥带你做项目,纯免费教学

浩哥带你做项目 一、YiYi-Web项目开发1. 简介2. 技术栈2.1 后端开发环境2.2 前端开发环境 3.项目截图 二、计算机游戏程序设计&#xff08;基础篇&#xff09;三、RuoYi-Cloud项目学习1.功能介绍2.项目截图 四、鸿蒙应用开发五、软考六、Linux基础知识学习 最近浩哥社区群涌进大…

项目1-加法计算器

1.创建项目 2.导入前端代码 2.1 static包内 2.2 测试前端代码是否有误 显示成功说明无误 2.3 定义用户接口 请求路径&#xff1a;calc/sum 请求方式&#xff1a;GET/POST 接口描述&#xff1a;计算两个整数相加 请求参数: 参数名类型是否必须备注num1Integer是参与计算的第…

JAVA 100道题(16)

16.编写一个程序&#xff0c;尝试打开一个不存在的文件&#xff0c;并捕获可能抛出的异常。 在Java中&#xff0c;你可以使用try-catch块来捕获和处理异常。下面是一个示例程序&#xff0c;尝试打开一个不存在的文件&#xff0c;并捕获FileNotFoundException异常&#xff1a; j…

面试宝典:MySQL中索引为什么使用B+树的深度分析

在高级数据库开发和优化的面试中&#xff0c;索引的结构和原理是一个绕不开的话题。MySQL中&#xff0c;B树是最常见的索引结构&#xff0c;它在性能和效率上都具有显著的优势。本文将深入分析为什么MySQL的索引选择使用B树&#xff0c;以及B树的特性如何使其成为数据库索引的理…

7.Java并发编程—掌握线程池的标准创建方式和优雅关闭技巧,提升任务调度效率

文章目录 线程池的标准创建方式线程池参数1.核心线程(corePoolSize)2.最大线程数(maximumPoolSize)3.阻塞队列(BlockingQueue) 向线程提交任务的两种方式1.execute()1.1.案例-execute()向线程池提交任务 2.submit()2.1.submit(Callable<T> task)2.2.案例-submit()向线程池…