*波动数列c++

题目

输入样例:

4 10 2 3

输出样例:

2

样例解释

两个满足条件的数列分别是2 4 1 3和7 4 1 -2。

思路

上来先理解题意,本题求的是“长度为n  总和为s的……数列的数目”。

假设第一项为x,增加 a 或者减少 b用di表示,那么满足题目要求(后一项总是比前一项增加 a或者减少 b)的数列都可以表示成:

x, x + d_{1}, x + d_{1} + d_{2}, x + d_{1} + d_{2} + d_{3} ..., x + d_{1} + d_{2} ... d_{n - 1}          (1)

数列前n项的和 s可以表示为:

s = nx + (n - 1)d_{1} + (n - 2)d_{2}, (n - 3)d_{3} ...+ (n - i)d_{i} + ... + d_{n}

那么:

x =\frac{​{s - \left [(n - 1)d_{1} + (n - 2)d_{2} + (n - 3)d_{3} ...+ (n - i)d_{i} + ... + d_{n}\right ]}}{n}                 (2)

        

        从上面(2)式可以看出,对于确定的s,n,每个x都由一组(d1, d2, ..., dn)唯一确定,同时,如果确定了一个x,那么一组(d1, d2, ..., dn)也会唯一确定,即一个数列就确定了,因此(d1, d2, ..., dn)的合法组数等于满足题目要求的数列总数。

        那什么样的一组(d1, d2, ..., dn)是合法解?由于x是整数,因此(2)式中的分子必须是n的倍数,即s和(n - 1)d_{1} + (n - 2)d_{2}, ... + d_{n}模n要同余。

状态表示

由上分析得知本题涉及到的变量为(d1, d2, ..., dn),以及(n - 1)d_{1} + (n - 2)d_{2}, ... + d_{n} mod n的同余数j。那么只要算出所有(n - 1)d_{1} + (n - 2)d_{2}, ... + d_{n}的组合模n的余数,将不同余数用一个数组f统计起来,比如余数为1的组合有多少种。那么最后输出f[s%n]即可。

  • 集合定义f[i, j]:对于(d1,d2,…di,...dn),只考虑前i项,当前的总和(注意是(n - 1)d_{1} + (n - 2)d_{2}, ... + d_{i}的总和)除以n的余数为j的组合 的集合(数目)。
  • 属性:前i项,当前总和除以n的余数为j的组合 的集合(数目)。

状态计算

状态计算一般就是抓住最后一步的不同来划分集合。本题最后一步的di可能为 加a 或者 减b

(1≤a,b≤10^6),划分的集合可看下图。

        假设组合(d1,d2,…di)的第i项di为a,((n - 1)d_{1} + (n - 2)d_{2}, ... + (n - i)a) mod n \equiv j

        那怎么由前面的状态推出f[i, j]呢?我们知道不管前i - 1项中的d是怎么变化的,只要是第i项di为a,并且((n - 1)d_{1} + (n - 2)d_{2}, ... + (n - i)a) mod n \equiv j 的(d1,d2,…di-1)组合都是合法的。那么这些(d1,d2,…di-1)组合的个数又怎么求呢??

我们两边都减去(n - i)a,得:

((n - 1)d_{1} + (n - 2)d_{2}, ... (n - i + 1)d_{i - 1}) mod n \equiv (j - (n - i)a)mod n

发现左式和 右式同余,根据集合定义,f[i - 1][([ j - (n - i)*a) mod n] 就是这些(d1,d2,…di-1)组合的个数。

        而对于第i项di为-b,同理可得f[i - 1][([ j + (n - i)*a) mod n] 就是这些(d1,d2,…di-1)组合的个数。

细节

  • 下标不能为负,j - (n - i)*a 可能为负数,而c++中对一个负数取模,相当于先用负数的绝对值取模,然后再加负号。 因此我们需要把j - (n - i)*a mod n转为正数。我们选择模 n 同余类中的最小非负数作为该同余类的代表数,所有负数x 模 n 都可以通过这条公式转化为代表数:(x % n + n) % n。
  • 长度n = 1时,根据(2)式,x只能是0。那么f[0][0] = 1(别忘了集合定义!!

代码
/*一道题,一包烟,一坐就是一整天*/
#include<bits/stdc++.h>
using namespace std;
const int MOD = 100000007, N = 1010;
int f[N][N];
int n, s, a, b;//求x mod n的正余数
int get_mod(int x)
{return (x % n + n) % n;
}int main()
{ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);cin >> n >> s >> a >> b;//边界处理f[0][0] = 1;for (int i = 1; i < n; i ++){for (int j = 0; j < n; j ++){f[i][j] = (f[i][j] + f[i - 1][get_mod(j - (n - i)*a)]) % MOD;f[i][j] = (f[i][j] + f[i - 1][get_mod(j + (n - i)*b)])  % MOD;}}//s可能为负数!!cout << f[n - 1][get_mod(s)];}

资料
  • 模运算定理
  • 同余类

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

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

相关文章

【Spring Boot 源码学习】深入应用上下文初始化器实现

《Spring Boot 源码学习系列》 深入应用上下文初始化器实现 一、引言二、往期内容三、主要内容3.1 spring-boot 子模块中内置的实现类3.1.1 ConfigurationWarningsApplicationContextInitializer3.1.2 ContextIdApplicationContextInitializer3.1.3 DelegatingApplicationConte…

【智能算法】斑鬣狗优化算法(SHO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过。 3.代码实现4.参考文献 1.背景 2017年&#xff0c;Dhiman等人受到斑鬣狗自然狩猎行为启发&#xff0c;提出了斑鬣狗优化算法(Spotted Hyena Optimizer, SHO)。 2.算法原理 2.1算法思想 SHO将斑鬣狗狩猎行为分为围捕-狩猎-进攻三…

Python入门(三)

序列 序列是有顺序的数据集合。序列包含的一个数据被称为元素&#xff0c;序列可以由一个或多个元素组成&#xff0c;也是可以没有任何元素的空序列。 序列的类型 元组&#xff08;定值表&#xff09;&#xff1a;一旦建立&#xff0c;各个元素不可再更变&#xff0c;所以一…

python-0008-修改django数据库为mysql

操作系统 centos7 执行 在虚拟环境中执行&#xff1a; pip3 install mysqlclient2.2.4 -i https://mirrors.aliyun.com/pypi/simple无法安装问题 如果安装mysqlclient时提示找不到对应的版本&#xff0c;或者编译失败&#xff0c;请退出虚拟环境&#xff0c;执行以下操作&…

2024华为春招Django面试题大全,最全知识点揭秘,面试必备!

为了帮助广大求职者更好地准备即将到来的面试&#xff0c;本文精心编撰了一系列涵盖InnoDB存储引擎关键知识点的面试题。这些问题不仅覆盖了InnoDB的基础知识&#xff0c;如其ACID特性、索引设计、锁机制等&#xff0c;还涵盖了性能优化、备份恢复策略等高级话题&#xff0c;旨…

【Spring Boot 3】【JSON】读取JSON文件

【Spring Boot 3】【JSON】读取JSON文件 背景介绍开发环境开发步骤及源码工程目录结构总结背景 软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历中,每次学习新技术总是要花…

简单函数_短信计费

任务描述 用手机发短信&#xff0c;一条短信资费为0.1元&#xff0c;但限定一条短信的内容在70个字以内&#xff08;包括70个字&#xff09;。如果你一次所发送的短信超过了70个字&#xff0c;则会按照每70个字一条短信的限制把它分割成多条短信发送。假设已经知道你当月所发送…

Wireshark抓包工具的使用

提示&#xff1a;本文为学习记录&#xff0c;若有错误&#xff0c;请联系作者&#xff0c;谦虚受教 文章目录 前言一、下载二、首页三、使用1.读入数据2.分析数据3.筛选IP4.保存数据 四、过滤器表达式五、TCP总结 前言 低头做事&#xff0c;抬头看路。 一、下载 下载路径wire…

【论文笔记合集】LSTNet之循环跳跃连接

本文作者&#xff1a; slience_me LSTNet 循环跳跃连接 文章仅作为个人笔记 论文链接 文章原文 LSTNet [25] introduces convolutional neural networks (CNNs) with recurrent-skip connections to capture the short-term and long-term temporal patterns. LSTNet [25]引入…

【Java刷题篇】串联所有单词的子串

这里写目录标题 &#x1f4c3;1.题目&#x1f4dc;2.分析题目&#x1f4dc;3.算法原理&#x1f9e0;4.思路叙述✍1.进窗口✍2.判断有效个数✍3.维护窗口✍4.出窗口 &#x1f4a5;5.完整代码 &#x1f4c3;1.题目 力扣链接: 串联所有单词的子串 &#x1f4dc;2.分析题目 阅…

口腔管理平台 |基于springboot框架+ Mysql+Java+B/S结构的口腔管理平台 设计与实现(可运行源码+数据库+lw文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 前台功能效果图 管理员功能登录前台功能效果图 会员功能 系统功能设计 数据库E-R图设计 lunwen参考…

智慧公厕建设的主要目标是什么?

随着城市化进程的不断推进&#xff0c;公共厕所作为城市基础设施的重要组成部分&#xff0c;也变得越来越重要。为了提升公共厕所的管理水平、提供更好的服务质量&#xff0c;智慧公厕应运而生。智慧公厕的建设旨在通过信息化手段实现公共厕所的全面感知监测&#xff0c;实现公…

remix Gas estimation failed,Remix中合约编译后的ABI以及bytecode位置,Remix中合约编译后的怎么测试

目录 remix Gas estimation failed Remix中合约编译后的ABI以及bytecode位置 Remix中合约编译后的怎么测试 remix Gas estimation failed 很有可能是你的solidity版本问题,重新复制我下编的,进行部署;

【Linux笔记-使用指南-备忘录】

虚拟机使用指南 创建虚拟机Linux使用指南yumJDKDockerLinux常用指令 RedisRedis配置key相关指令String相关指令待续... 创建虚拟机 点击我创建虚拟机 Linux使用指南 yum # 更新yum包 sudo yum update -y# 加入安装过旧版本&#xff0c;先卸载旧版本 sudo yum remove docker…

redis的基本知识点

连接Redis 在进行Redis操作之前&#xff0c;首先需要连接到Redis服务器。这可以通过使用redis-cli命令实现&#xff0c;具体命令格式如下&#xff1a; redis-cli -h <host> -p <port>其中&#xff0c;是Redis服务器的主机名或IP地址&#xff0c;是Redis服务器的端…

C语言自定义数据类型:用typedef声明新类型名

参考原文链接&#xff1a;https://blog.csdn.net/qq_57342311/article/details/129616215 除了可以直接使用 C 提供的标准类型名(如 int&#xff0c;char&#xff0c;float, double 和 long 等)和程序编写者自己声明的结构体、共用体、枚举类型外&#xff0c;还可以用 typedef …

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:FormLink)

提供静态卡片交互组件&#xff0c;用于静态卡片内部和提供方应用间的交互&#xff0c;当前支持router、message和call三种类型的事件。 说明&#xff1a; 该组件从API Version 10开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 该组件仅可…

6.【Linux】进程间通信(管道命名管道||简易进程池||简易客户端服务端通信)

介绍 进程间通信的方式 1.Linux原生支持的管道----匿名和命名管道 2.System V-----共享内存、消息队列、信号量 3.Posix------多线程、网路通信 进程间通信目的 数据传输&#xff1a;一个进程需要将它的数据发送给另一个进程 资源共享&#xff1a;多个进程之间共享同样的资源。…

Android存储概念及路径解析

Android存储概念及路径解析 在Android开发领域&#xff0c;理解不同的存储类型及其对应的文件系统路径对于设计和实现应用至关重要。本文将深入探讨内部存储、外部存储、内存和缓存的概念&#xff0c;并阐明storage/sdcard与mnt/sdcard的区别&#xff0c;以及/storage/emulate…

【C++刷题】优选算法——动态规划第一辑

1.状态表示是什么&#xff1f;简答理解是dp表里的值所表示的含义怎么来的&#xff1f;题目要求经验题目要求分析问题的过程中&#xff0c;发现重复子问题 2.状态转移方程dp[i]......细节问题&#xff1a;3.初始化控制填表的时候不越界4.填表顺序控制在填写当前状态的时候&#…