前缀和 求数列的子序列的K倍区间

(直接截图比复制文字要好多了)

不会做的时候我去看了之前做的关于这道题目的笔记,

(Ak + 1)% k == 1 (Ak + 1 + Ak)% k == 1

只要发现了同余数的情况就说明有一个区间满足了题目的要求。

这个方法的精妙之处就在于前缀和包括了之前的前缀和和下一个的数字之和(相邻的两个是这样的,如此一来,单个数字 % k == 0的就也能够被检查到了,就是把单个数组也看作了是一个区间。准确说是结合才对。

(这里还是建议去多举几个例子,去理解一下这句话的含义))

不清楚问题,我直接去看了题解

顺着这个思路其实很容易就能发现一个方法——求出那些个区间再使用排列组合,把可能的组合都用公式计算出来。(考虑到一些区间是断裂的,由(Ak + 1)% k == 1 (Ak + 1 + Ak)% k == 1想到,一种特殊的可能就是区间里面的所有数字都可以被k整除)  但是转念一想,不是所有的数都一定是k的整数倍。但是受到Ak + 1)% k == 1 (Ak + 1 + Ak)% k == 1的影响,我还是只考虑了单个元素,而忘了区间的概念,区间的组合是可以用排列组合来处理的。于是我想到了下面的一一对比的方法。

package 练习;

import java.util.*;

public class K倍区间 {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		int N = scan.nextInt();
		int K = scan.nextInt();
		scan.nextLine();
		int number = 0;
		int[] sum = new int[N + 1];

		for (int i = 1; i <= N; i++) {
			sum[i] = scan.nextInt() + sum[i - 1];
			for(int j = 0; j < i; j++)
			    if(sum[i] % K == sum[j] % K) 
			       number ++;
			scan.nextLine();
		}
		
		System.out.println(number);
		
	}
}

我想不明白,为什么我这for循环里面的for都似乎只有条件满足才执行的,为什么还是超时了。难道不管执不执行,两个for循环都会消耗大量的时间。

就是如此——

if语句本身的时间复杂度是O(1),即常数时间复杂度,不受问题规模N的影响。这是因为每次执行if语句时,仅进行一次条件判断,其执行时间是固定的,不随N的增大而增大。

时间复杂度能忽略掉if条件判断的情况是,其时间复杂度远远超过了if语句造成的影响。但是,如果if的执行次数是整个程序的大头就不能忽略了

事实上

每一条Java语句,或者任何编程语言中的语句,都有其执行所需的时间成本,可以理解为占有一定的“时间复杂度”。

找到占大头的开销语句,在没有积累起一些反例之前,不要被具体的例子蒙蔽了双眼,去考虑书上那些容易被忽略的知识。if 和 for循环里面的的都有可能让你的时间复杂度暴增。

回到问题本身,我们不难发现,这个if语句的时间复杂度为

N * (1 + 2 + 3 + ... + N)
= N * (N * (N + 1)) / 2
= O(N^3 / 2)
≈ O(N^3)

这在蓝桥杯里面肯定是不可能被判定得分的。(除了数据特别少的情况下)

不成立的时候也总过有没有方法能和sum[ i ]的相同值,就像人脑一样,可以直接比较,看到了相同的数值就直接比较。但是计算机就是直接比较的,全部都要找一遍(for循环)但是又回到了原点。

最后我去看了题解,发现

#include<bits/stdc++.h>
using namespace std;
int n,k,a;
long long ans,sum,book[100005];
int main(){
	cin >> n >> k;
	book[0]++;  //把S0放进去,因为S0=0,所以给book[0]++
	for(int i=1;i<=n;i++){
		scanf("%d",&a);
		sum=(sum+a)%k; //sum是前缀和 也就是Si
		book[sum]++;
	}
	for(int i=0;i<k;i++)//注意 余数是0~m-1
		ans+=(book[i]*(book[i]-1))/2;
	cout << ans;
	return 0;
 } 
 //by chenhaotian0219

这里面的book[sum]吸引力我的注意。

这不就是映射吗,通过同余定理,把映射后的值域(0 < 数值 < k)设置数组也很方便,数值区间确定了,数组大小就不是问题了。(sun[ i ] % k == n == f (x) ),Y值域就是满足我们要求的,结合数组的特点就能够解决问题了。

数据结构里面的散列表就是这样被设计的。

这样字直接比较就做到了,for循环只是为了然所有的sum[ i ]都显现出来。

也看到了

#include<bits/stdc++.h>
using namespace std;
#define int long long
int a,sum,p[1000001],n,k,ans;
signed main(){
    cin>>n>>k;
    p[0]=1;//定义初始值
    for(int i=1;i<=n;i++){
        cin>>a;
        sum+=a;
        sum%=k;
        p[sum]++;//对应余数的个数加一
    }
    for(int i=0;i<k;i++){
        ans+=(p[i]*(p[i]-1)/2);//从n个数里面选两个,共有n*(n-1)/2种选法。
    }
    cout<<ans;
    return 0;
}
for(int i=0;i<k;i++){
        ans+=(p[i]*(p[i]-1)/2);//从n个数里面选两个,共有n*(n-1)/2种选法。
    }

这格代码看起来很突兀,其实是我一开始的排列组合思考的排列组合,但是这里的是区间的。(最后这个for循环是从0开始的,指的是多格倍数部分,不是一个区间的)

单个区间的已经被计算过了(x),那么 a1 、 a2、a3 ... an 那么就是 n - 1 + n -2 + n - 3 + .. + 3 + 2 + 1(最后一个没有在里面,你把数字和个数一一对应就可以验证这个结论)。或者你这样子想——其实相互比较多是相邻的两个的sum[ i ]比较,组合就是跨国几个,还是两两比较。

一些无关的


签注和 —— 数列的和,如果你熟读数学,那么你可能就会独立发现这个算法。这就是数学的奥秘。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STM32H7使用FileX库BUG,SD卡挂载失败

问题描述&#xff1a; 使用STM32H7ThreadXFileX&#xff0c;之前使用swissbit牌的存储卡可正常使用&#xff0c;最近项目用了金士顿的存储卡&#xff0c;发现无法挂载文件系统。 原因分析&#xff1a; 调试过程发现&#xff0c;关闭D-Cache可以挂载使用exfat文件系统。 File…

C语言-用二分法在一个有序数组中查找某个数字

1.题目描述 有15个数按由大到小顺序放在一个数组中&#xff0c;输入一个数&#xff0c;要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中&#xff0c;则输出“无此数” 二.思路分析 记录数组中左边第一个元素的下标为left&#xff0c;记录数组右边第一个…

2024年畜牧、养殖业与智慧农业国际会议(ICLAHSA2024)

2024年畜牧、养殖业与智慧农业国际会议(ICLAHSA2024) 会议简介 2024国际畜牧业与智慧农业大会&#xff08;ICLAHSA2024&#xff09;将在深圳隆重举行。本次大会旨在汇聚全球畜牧业、畜牧业、智慧农业等领域的专家学者&#xff0c;共同探索行业前沿技术、创新模式和发展趋势…

电脑回收站的东西还原后会在哪里?一文给你答案!

“很奇怪&#xff0c;想问问大家&#xff0c;我电脑回收站里还原的文件会被保存在哪里呀&#xff1f;刚刚恢复文件的时候本来想直接将它拖出&#xff0c;却发现文件不见了&#xff0c;这种情况应该怎么解决呢&#xff1f;” 电脑回收站是一个特殊的文件夹&#xff0c;用于临时存…

【LLMOps】小白详细教程,在Dify中创建并使用自定义工具

文章目录 博客详细讲解视频点击查看高清脑图 1. 搭建天气查询http服务1.1. flask代码1.2. 接口优化方法 2. 生成openapi json schema2.1. 测试接口2.2. 生成openapi schema 3. 在dify中创建自定义工具3.1. 导入schema3.2. 设置工具认证信息3.3. 测试工具 4. 调用工具4.1. Agent…

PC-3000 Mobile Pro: 智能手机及平板设备数据提取工具

天津鸿萌科贸发展有限公司从事数据安全业务20余年&#xff0c;在数据恢复、数据取证、数据备份等领域有丰富的案例经验、前沿专业技术及良好的行业口碑。同时&#xff0c;公司面向取证机构及数据恢复公司&#xff0c;提供数据恢复实验室建设方案&#xff0c;包含数据恢复硬件设…

跨境电商亚马逊、虾皮等平台做测评要用什么IP?

IP即IP地址&#xff0c;IP地址是指互联网协议地址&#xff08;英语&#xff1a;Internet Protocol Address&#xff0c;又译为网际协议地址&#xff09;&#xff0c;是IP Address的缩写&#xff0c;IP地址是IP协议提供的一种统一的地址格式 功能&#xff1a;它为互联网上的每一…

SpringMVC笔记——SpringMVC基础Tomcat环境配置

Tomcat安装配置 下载Apache Tomcat 进入官网https://tomcat.apache.org/&#xff0c;选择tomcat 9 这边使用idea开发&#xff0c;建议直接下载压缩包 无法访问下载的可以直接用我的下载链接&#xff1a;https://cloudreve.zxbdwy.online/s/6nSA 提取码&#xff1a;w1pwk3将压…

嵌入式学习60-C++

知识零碎&#xff1a; C# &#xff1a;window下用于vs stdio编程 …

Pyside6:QDialog按钮变为中文

如果在Qt Designer中创建了一个Qdialog&#xff0c;自带按钮的类型&#xff0c;那么在Designer中显示是中文&#xff0c;但在运行时将变成英文。 如果程序不需要进行国际化&#xff0c;只在国内使用&#xff0c;那么进行中文化的操作还是有必要的&#xff0c;其实方式很简单&am…

常见七大排序(汇总)

目录 引言 交换函数 直接插入排序 思想 时间复杂度 希尔排序 思想 时间复杂度 选择排序 思想 时间复杂度 堆排序 思想 时间复杂度 冒泡排序 思想 时间复杂度 快速排序&#xff08;递归&#xff09; 霍尔法 前后指针法 三数取中 & 随机值法 第一种是随…

C++ 核心编程 - 内存分区模型

文章目录 1.1 程序运行前1.2 程序运行后1.3 new 操作符 C 程序在执行时&#xff0c;将内存大致划分为 4个区域&#xff1a; 代码区&#xff1a;存放函数体的二进制代码&#xff0c;由操作系统进行管理&#xff1b;全局区&#xff1a;存放全局变量和静态变量以及常量&#xff1…

【CSS】CSS实现元素逐渐消失(实现元素透明逐渐消失/模糊)

mask-image: linear-gradient(to bottom, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 1) 10%);mask-image 属性用于定义一个遮罩&#xff0c;它可以隐藏元素的一部分或全部内容。在这个示例中&#xff0c;我们使用 mask-image 属性来定义一个线性渐变的遮罩&#xff0c;使得列表项的内…

nginx配置ip_hash负载均衡策略

一、nginx配置ip_hash负载均衡策略 nginx默认的负载均衡策略为轮询&#xff0c;某些场景需要使用ip_hash负载策略&#xff0c;即&#xff1a;同一个ip地址&#xff0c;永远访问nginx后面同一台tomcat。配置示例如下&#xff0c;主要是设置ip_hash&#xff1a; upstream www.ab…

机器视觉系统-工业光源什么是高角度光,以及发光角度得分类

光路描述&#xff1a;光线与水平面角度>45称为高角度光。 效果分析&#xff1a;高角度照射&#xff0c;光线经 被测物表面平整部分反射后进入镜头&#xff0c;图像效果表现为灰度值较高&#xff1b;不平整部分反射光进入不了镜头&#xff0c;图像效果表现为灰度值较低。 主要…

【Vue】自定义事件实现组件之间的通信(案例讲解)

一、前言 这是部分哔哩哔哩上跟着一个博主【遇见狂神说】学习的&#xff0c;当然自己也是才开始学习的vue&#xff0c;在学到这个Vue的自定义事件的时候&#xff0c;虽然知识点很绕&#xff0c;但是在理解后又觉得很意思&#xff0c;觉得Vue真的很强大。这里博主将自己学习到的…

2、选择什么样的机器人本体

如果说世界是物质的&#xff0c;那么应该先制造出机器人的本体&#xff0c;再让她产生灵魂。如果是精神的呢&#xff0c;世界是无中生有的呢&#xff0c;那就先在仿真中研究算法吧。 而我比较崇尚初中哲学的一句话&#xff0c;世界是物质的&#xff0c;物质是运动的&am…

[已测试]TVBox二次开发影视系统酷点1.4.4反编译版本

支持p2p, 磁力等播放 支持多仓切换vip线路 自动换源开关 启动时直接进入直播 原始轮播图和幻灯片切换 加大防抓包的可能性 支持安卓4.x版本 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/89084105 更多资源下载&#xff1a;关注我。

科技改变视听4K 120HZ高刷新率的投影、电视、电影终有用武之地

早在1888年&#xff0c;法国生理学家埃蒂安朱尔马莱就发明了一套盒式摄像机&#xff0c;能以120帧/s的速度在一条纸膜上曝光照片&#xff0c;但是当时没有相匹配的放映设备。而马莱的另一套拍摄设备是60帧/s的规格&#xff0c;并且图像质量非常好。 受此启发&#xff0c;雷诺的…

CobaltStrike使用插件实现免杀

免责声明&#xff1a;本工具仅供安全研究和教学目的使用&#xff0c;用户须自行承担因使用该工具而引起的一切法律及相关责任。作者概不对任何法律责任承担责任&#xff0c;且保留随时中止、修改或终止本工具的权利。使用者应当遵循当地法律法规&#xff0c;并理解并同意本声明…