[ABC384D] Repeated Sequence 题解

题目大意

给你一个周期为 nnn 的无穷序列 a=(a1,a2,a3,… )a=(a _ 1,a _ 2,a _ 3,\dotsc)a=(a1,a2,a3,) 的前 aaaa1,a2,…,aNa _ 1,a _ 2,\dotsc,a _ Na1,a2,,aN

请判断该无穷序列是否存在和为 sss 的非空连续子序列。

题目做法

这道题目中的 sss 并不是要直接建一个无穷序列暴力算出来,而是我们可以想到能装下一个循环的段落就可以不用考虑了,只需求出多余的序列的部分就行了。

求出多余的序列的部分又可以直接变成维护左右两个指针就可以了。如果区间和比目标值大,那就左指针加 111 。如果区间和比目标值小,那就右指针加 111 。如果相等就输出 Yes就可以了。

AC代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,s,s1,s2,l,r,p,a[5000005];
main(){
	cin>>n>>s;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		a[i+n]=a[i]; //把数组复制一份到后面 
		s1+=a[i]; //计算一个周期的和 
	}
	s2=s/s1; //有多少段周期
	s=s-(s2*s1); //算出要算的 
	l=1;
	r=1;
	p=a[1]; 
	while(l<=n&&r<=n*2){
		if(p>s){
			//如果区间和比目标值大,那就左指针加 1。
			p-=a[l];
			l++;
		}else if(p<s){
			//如果区间和比目标值小,那就右指针加 1。
			r++;
			p+=a[r];
		}
		if(p==s){
			//找到相等的直接推出。 
			puts("Yes");
			exit(0);
		}
	}
	puts("No");
	return 0;
}
<think>嗯,用户提出了一个关于ESP报文错误的问题:"wrong sequence number for SPI repeated"。这个错误看起来和SPI通信中的序列号校验失败有关。用户引用了几个ESP相关的资料,但核心需求是解决这个特定的序列号错误。 用户提供的引用资料里,[1]提到SPI_Flash.cpp编译失败的问题,[2]涉及内存映射失败,[3][4][5]都是关于ESP8266分区表配置和编译错误的。虽然这些不是直接答案,但说明用户可能在开发ESP系列设备时遇到了底层通信问题。 从技术角度看,这个错误通常发生在SPI主从设备通信时,从设备发现主设备发送的序列号与预期不符。可能的原因有: 1. 时序问题:SPI时钟不稳定导致数据采样错误 2. 中断干扰:高优先级中断打断了SPI传输 3. 缓冲区溢出:数据未及时处理导致新数据覆盖旧数据 4. 多主设备冲突:多个主设备同时访问总线 5. 固件配置错误:SPI模式或时钟相位设置不匹配 用户没有说明具体硬件平台,但引用中多次出现ESP8266/ESP32,推测可能是物联网设备开发场景。需要提醒用户检查SPI初始化配置,特别是CPOL/CPHA的设置是否和从设备一致。另外,ESP的SPI库有时需要手动处理CS引脚,自动CS控制可能在某些情况下失效。 解决方案应该分层次: 首先用逻辑分析仪抓取SPI波形确认实际传输的序列号 然后检查DMA配置(如果有使用) 对于ESP32,还要注意psram共存时的总线冲突问题 用户可能是嵌入式开发者,问题描述很专业但缺少细节。在回复中需要引导用户提供更多环境信息,同时给出通用排查步骤。考虑到用户之前遇到过编译错误,还要提醒固件版本兼容性问题。</think>以下是关于 ESP 报文错误 "wrong sequence number for SPI repeated" 的原因分析和解决方法: --- ### **错误原因分析** 1. **SPI 通信时序冲突** - 主设备(如 MCU)与从设备(如 Flash)的 SPI 通信序列号(Sequence Number)不匹配,通常由以下情况导致: - **时钟干扰**:SPI 时钟(SCLK)信号不稳定(如毛刺、抖动),导致数据采样错位。 - **时序违规**:SPI 时钟频率过高或信号延迟超标(如 CS 建立/保持时间不足),违反设备时序要求[^3][^5]。 - **多设备竞争**:多个 SPI 设备共享总线时未正确管理片选(CS)信号,造成数据冲突。 2. **固件/驱动配置错误** - **SPI 模式不匹配**:主从设备的 SPI 模式(CPOL/CPHA)配置不一致(如主机 Mode 0,从机 Mode 1)。 - **缓冲区溢出**:SPI 接收缓冲区未及时处理,新数据覆盖未读取的旧数据,导致序列号断层[^1][^2]。 - **DMA 配置问题**:使用 DMA 传输时,内存地址或数据长度配置错误。 3. **硬件问题** - **信号完整性差**:长走线、未匹配阻抗或电磁干扰(EMC)导致信号畸变。 - **供电不稳定**:电压波动引起 SPI 设备工作异常。 - **Flash 分区错误**:分区表配置与 Flash 实际容量不匹配(常见于 ESP8266/ESP32)[^3][^5]。 --- ### **解决方法** #### **1. 检查 SPI 配置** ```c // 示例:ESP32 SPI 初始化代码(需确保主从设备参数一致) spi_bus_config_t buscfg = { .miso_io_num = GPIO_NUM_19, .mosi_io_num = GPIO_NUM_23, .sclk_io_num = GPIO_NUM_18, .quadwp_io_num = -1, .quadhd_io_num = -1, .max_transfer_sz = 4096, }; spi_device_interface_config_t devcfg = { .clock_speed_hz = 10 * 1000 * 1000, // 降低时钟频率调试 .mode = 0, // 检查 CPOL=0, CPHA=0 .spics_io_num = GPIO_NUM_5, .queue_size = 3, }; spi_bus_initialize(SPI2_HOST, &buscfg, SPI_DMA_CH_AUTO); spi_bus_add_device(SPI2_HOST, &devcfg, &spi_handle); ``` - **关键点**: - 降低时钟频率(如从 40MHz 降至 10MHz)排除时序问题。 - 确认 `CPOL/CPHA` 与从设备一致(参考设备手册)。 #### **2. 优化硬件设计** - **缩短走线**:SPI 信号线长度尽量 ≤ 10cm。 - **增加上拉电阻**:在 SCLK、MOSI、MISO 上添加 4.7kΩ 上拉电阻。 - **电源滤波**:SPI 设备 VCC 并联 100nF + 10μF 电容。 #### **3. 修复固件问题** - **检查分区表**:确保分区表地址与 Flash 容量匹配(ESP8266/ESP32 常见错误)[^3][^5]: ```python # 分区表示例(ESP32) factory, app, factory, 0x10000, 1M data, data, spiffs, 0x150000, 1M ``` - **启用错误重试机制**: ```c // 添加 SPI 传输重试逻辑 esp_err_t ret; int retry_count = 0; do { ret = spi_device_transmit(spi_handle, &trans_desc); if (ret == ESP_ERR_TIMEOUT) retry_count++; } while (ret != ESP_OK && retry_count < 3); ``` #### **4. 诊断工具** - **逻辑分析仪**:抓取 SPI 波形,检查序列号跳变位置(如 Saleae Logic)。 - **ESP 错误日志**:启用 `CONFIG_SPI_FLASH_DEBUG` 输出详细 SPI 操作日志。 --- ### **典型场景案例** - **案例 1**:ESP32 使用 PSRAM 时 SPI 冲突 **现象**:启用 PSRAM 后出现序列号错误。 **解决**:在 `menuconfig` 中关闭 `PSRAM` 或降低 SPI Flash 时钟至 20MHz(`CONFIG_SPI_FLASH_40M_SUPPORT=n`)[^2]。 - **案例 2**:ESP8266 分区表错误 **现象**:下载固件时报错 `partition type 6 addr:3fd000 len:3000`[^3]。 **解决**:调整分区表地址范围,确保不超过 Flash 物理大小(如 4MB Flash 最大地址为 `0x3FFFFF`)。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值