[蓝桥杯]波动数列

题目描述
观察这个数列:1 3 0 2 -1 1 -2 …这个数列中后一项总是比前一项增加2或者减少3。
栋栋对这种数列很好奇,他想知道长度为 n 和为 s 而且后一项总是比前一项增加a或者减少b的整数数列可能有多少种呢?
输入
输入的第一行包含四个整数 n s a b,含义如前面说述。
1<=n<=1000,-1,000,000,000<=s<=1,000,000,000,1<=a, b<=1,000,000。
输出
输出一行,包含一个整数,表示满足条件的方案数。由于这个数很大,请输出方案数除以100000007的余数。
样例输入
4 10 2 3
样例输出
2

解题思路:
我们不妨设ddd+a+a+a或者为−b-bb,则d=(+a,−b)d = (+a,-b)d=(+a,b),然后我们就知道这个数列是这样的:
x,x+d1,x+d1+d2,⋯,x+d1+d2+⋯+dn−1x ,x+d_1,x+d_1+d_2,\cdots,x+d_1+d_2+\cdots+d_{n-1}x,x+d1,x+d1+d2,,x+d1+d2++dn1

这个数列的合为sss,所以我们可以得到:
nx+(n−1)d1+(n−2)d2+⋯+dn−1=snx+(n-1)d_1+(n-2)d_2+\cdots+d_{n-1} = snx+(n1)d1+(n2)d2++dn1=s

然后得到:
s−[(n−1)d1+(n−2)d2+⋯+dn−1]n\frac{s-[(n-1)d1+(n-2)d2+\cdots+d_{n-1}]}{n}ns[(n1)d1+(n2)d2++dn1]===xxx

所以我们可以知道s模n与[(n−1)d1+(n−2)d2+⋯+dn−1]模n相等s模n与[(n-1)d_1+(n-2)d_2+\cdots+d_{n-1}]模n相等sn[(n1)d1+(n2)d2++dn1]n

又因为dnd_ndn = (+a,−b)(n=1,2,3,...,n)(+a,-b) (n = 1,2,3,...,n)(+a,b)(n=1,2,3,...,n),所以我们可以得到:
s模n与[d1+2d2+⋯+(n−1)dn−1]模n相等s模n与[d_1+2d_2+\cdots+(n-1)d_{n-1}]模n相等sn[d1+2d2++(n1)dn1]n

现在我们设dp[i][j]表示表示要选i个a或者-b且余数为j的所有集合的数量。

那么我们现在思考关系表达式:
现在我们要选的是第i项的d,意思就是第i项的d是要+a,还是-b,在第i项前面的,都是已经选好的了,所以:

在这里插入图片描述
我们设第i项前面的d加起来总和为C,然后我们可以根据
d1+2d2+⋯+(n−1)dn−1d_1+2d_2+\cdots+(n-1)d_{n-1}d1+2d2++(n1)dn1,可以得到:
(C+i∗di)模n=j(C+i*d_i)模n =j(C+idi)n=j

那么C模n就等于(j−i∗di)模nj - i*d_i)模njidi)n

则得到关系表达式:

f[i][j] = (f[i-1][get_mod(j-a*i,n)]+f[i-1][get_mod(j+b*i,n)])%MOD;

这里我们之所以对a模b要用(a%b+b)%b的形式,是因为C++中的%与数学上的取模不太一样,举个例子:

1.C++:-2%3 = -2,出现了负数,在数组中a[i],i不能为负,因此要转换。

2.数学上:-2%3 = 1

所以要用这个公式让C++进行数学上的取模(a%b+b)%b,只要C++取模以后得到的结果可能为负数,推荐都用公式进行这样的转换:
C++手写a除以b的正余数

然后想想如何初始化,初始化也很简单,dp[0][0] = 1,他选0项,那么总和肯定是0,0模n也是0,所以为1

代码如下:

#include <iostream>
using namespace std;
const int N = 1010;
int dp[N][N];
const int MOD = 100000007;
int get_mod(int a,int b)
{return (a%b+b)%b;
}int main()
{int n,s,a,b;cin>>n>>s>>a>>b;dp[0][0] = 1;for (int i = 1;i<n;i++)for (int j = 0;j<n;j++)dp[i][j] = (dp[i-1][get_mod(j-a*i,n)]+dp[i-1][get_mod(j+b*i,n)])%MOD;cout<<dp[n-1][get_mod(s,n)]<<endl;return 0;
}

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

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

相关文章

ASP.NET 开源导入导出库Magicodes.IE Docker中使用

更新历史2019.02.13【Nuget】版本更新到2.0.2【导入】修复单列导入的Bug&#xff0c;单元测试“OneColumnImporter_Test”。问题见&#xff08;https://github.com/dotnetcore/Magicodes.IE/issues/35&#xff09;。【导出】修复导出HTML、Pdf、Word时&#xff0c;模板在某些情…

python爬取评论_python 爬取马蜂窝景点翻页文字评论的实现

使用Chrome、python3.7、requests库和VSCode进行爬取马蜂窝黄鹤楼的文字评论(http://www.mafengwo.cn/poi/5426285.html)。 首先&#xff0c;我们复制一段评论&#xff0c;查看网页源代码&#xff0c;按CtrlF查找&#xff0c;发现没有找到评论&#xff0c;说明评论内容不在http…

[蓝桥杯]最大连续子序列和

对于一个给定的长度为N的整数序列A&#xff0c;它的“子序列”的定义是&#xff1a;A中非空的一段连续的元素&#xff08;整数&#xff09;。你要完成的任务是&#xff0c;在所有可能的子序列中&#xff0c;找到一个子序列&#xff0c;该子序列中所有元素的和是最大的&#xff…

一个支持 CodeFirst/DbFirst/ModelFirst 的数据库小工具

一个支持 CodeFirst/DbFirst/ModelFirst 的数据库小工具IntroDbTool 是一个支持 CodeFirst/DbFirst/ModelFirst 的数据库小工具&#xff0c;原本是基于 dotnet framework WinForm 实现的&#xff0c;在 1.1.0 版本更新中使用 dotnet core 3.1 基于 WPF 重写了&#xff0c;并实现…

python os模块详细_python之os模块详解

importos#os.getcwd() 获取当前工作目录&#xff0c;即当前python脚本工作的目录路径#print(os.getcwd()) # G:\python二期\一月\day18 #os.curdir 返回当前目录: (.) current#os.pardir 获取当前目录的父目录字符串名&#xff1a;(..)#print(os.listdir(rG:\python二期\一月\d…

高级数据结构---并查集

高级数据结构—并查集 原理&#xff1a;参考趣学数据结构 代码&#xff1a; #include<stdio.h> #include<stdlib.h> #define N 100 int father[N]; int find(int x) {//寻找共同祖先if (x ! father[x]) {father[x] find(father[x]);}return father[x];//找到了…

m个苹果放入n个盘子问题

题目&#xff1a; 把M个同样的苹果放在N个同样的盘子里&#xff0c;允许有的盘子空着不放&#xff0c;问共有多少种不同的分法&#xff1f;&#xff08;用K表示&#xff09;5&#xff0c;1&#xff0c;1和1&#xff0c;5&#xff0c;1 是同一种分法。 输入 每个用例包含二个整…

用python处理excel的基本语法_《使用python3读取处理excel表的数据内容如何对内容求平均值》 用python读取excel文件...

使用python3读取处理excel表的数据内容如何对内容求平均值 先说下概述&#xff1a; 平就合平均数的值。 (a1 a2 ……an)/na1&#xff0c;a2&#xff0c;……&#xff0c;an的平均值。 简单算均数。么一组数字10、20、30、40、50 那么它们的算术平均值是&#xff08;10 20 30 40…

k8s - 如何变更CNI网络插件IP池?

作者&#xff1a;justmine头条号&#xff1a;大数据与云原生微信公众号&#xff1a;大数据与云原生创作不易&#xff0c;在满足创作共用版权协议的基础上可以转载&#xff0c;但请以超链接形式注明出处。为了方便阅读&#xff0c;微信公众号已按分类排版&#xff0c;后续的文章…

word List23

word List23 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;

整数的分法

将整数N分成K个整数的和且每个数大于等于A 小于等于B 求有多少种分法&#xff1f; 代码如下&#xff1a; #include <iostream> using namespace std;int fff(int a, int k, int mins, int maxs) {if (a < mins)//结束条件有两个&#xff0c;1.数值小于最小值 2.只分…

一个新实验:使用gRPC-Web从浏览器调用.NET gRPC服务

今天给大家翻译一篇由ASP.NET首席开发工程师James Newton-King前几天发表的一篇博客&#xff0c;文中带来了一个实验性的产品gRPC-Web。大家可以点击文末的讨论帖进行相关反馈。我会在文章末尾给出原文链接。全部译文如下&#xff1a;我很高兴宣布通过.NET对gRPC-Web进行实验性…

python文件图标变成小电脑_手把手教你给Python程序写图形界面,并且打包成exe文件-exe文件...

环境配置 官网下载Python3&#xff0c;LZ的配置环境是Python3.6&#xff0c;PyCharm 2017.2.1pip3 install PyQt5 #下载PyQt5 pip install PyQt5-tools -i http://pypi.douban.com/simple --trusted-hostpypi.douban.com #下载工具designer.exe&#xff0c;来开发图形界面 在Py…

数据结构(哈夫曼树+KMP)之 数据加密+解密

数据结构&#xff08;哈夫曼树KMP&#xff09;之 数据加密解密 原理&#xff1a;参考趣学数据结构 代码&#xff1a; #include<stdio.h> #include<stdlib.h> #define N 100 #define INF 2^31-1 int next[N]; int Sum 0;//权重总和 typedef struct fNode {//哈夫…

数的划分

问题描述   将整数n分成k份&#xff0c;且每份不能为空&#xff0c;任意两份不能相同(不考虑顺序)。   例如&#xff1a;n7&#xff0c;k3&#xff0c;下面三种分法被认为是相同的。   1&#xff0c;1&#xff0c;5; 1&#xff0c;5&#xff0c;1; 5&#xff0c;1&#x…

扩展性思维

扩展性思维&#xff0c;简单来说就是举一反三、触类旁通&#xff1b;它的核心目标是提升我们思维的广度&#xff0c;也就是让我们的知识树变得更加开阔&#xff1b;具备了这样的知识树后才能发现要解决的同类型事情一起解决。下面以几个举一反三的例子讲一下扩展性思维&#xf…

C语言 ---文件读取

C语言 —文件读取 参考学习链接&#xff1a; https://blog.csdn.net/qq_38149046/article/details/80359743 http://c.biancheng.net/view/2068.html 代码&#xff1a; #include<stdio.h> #include<stdlib.h> int main() {FILE *fp;char ch;//如果文件不存在&am…

个人永久性免费-Excel催化剂功能第119波-一大波虚构数据,支持多国语言版本

日常的数据分析过程中或者制作教程过程中&#xff0c;难免要生成一些示例数据、虚构数据&#xff0c;Excel除了几个基础的随机数值函数外&#xff0c;没有什么额外的支持&#xff0c;本篇再次补全这个缺陷。虚构函数的由来本次的功能&#xff0c;使用老外做的轮子&#xff0c;有…

python可变参数和关键字参数位置_python中函数的默认参数和可变长参数如何排列?...

参数在python中总是通过赋值进行传递的。在默认情况下&#xff0c;参数是通过其位置进行匹配的&#xff0c;从左到右&#xff0c;而且必须精确的传递和函数头部参数名一样多的参数。 这种默认的传递方式很简单 def f(a,b,c): print(a,b,c) f(1,2,3) 1 2 3 python中可以使用基于…

word List 24

word List 24 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;