首页 > 其他分享 >洛谷 P8614 [蓝桥杯 2014 省 A] 波动数列 的题解

洛谷 P8614 [蓝桥杯 2014 省 A] 波动数列 的题解

时间:2024-05-30 09:32:35浏览次数:28  
标签:P8614 取模 方程 int 题解 蓝桥 ti dp 1000

题目大意

求满足和为 s s s 且 t i = t i − 1 + a t_i=t_{i-1}+a ti​=ti−1​+a 或 t i = t i − 1 − b t_i=t_{i-1}-b ti​=ti−1​−b 的长度为 n n n 的数列 t t t 的方案数。

思路

首先,得确定大概方向:

一提到方案数,你会想到什么?

  • 搜索(当然可以,只是会 T 到飞起)

  • 记忆化搜索(emmm,我暂时还没研究过,或许可以吧)

  • 大炮——dp!(此题正解)

其次,冷静分析数据范围:

看到题目里面的 n ≤ 1000 n \leq 1000 n≤1000,再看看空间范围就可以大概猜测:用 O ( n 2 ) O(n^2) O(n2) 的时空复杂度。这就是本题最清晰的解法。

然后,设计状态:

我们发现只有 n n n 这一个变量可以二重循环,因此,我们尝试进行每重循环的次数都和 n n n 有关。但是即使这样,空间也有可能不够啊!后面的都是 1 0 6 10^6 106 级以上的!怎么办?我们会想到取模。于是设 d p i , j dp_{i, j} dpi,j​ 表示前 i i i 项的和模 n n n 等于 j j j 时的方案数。

最后,最重要的转移方程:

关于取模的转移方程,我不细讲了,就看 RoMantic_Queue 大佬的吧。觉得他讲的详细些。

在一些数学推导(其实这题也是个数学题)后,得到转移方程 d p [ i ] [ j ] = ( d p [ i − 1 ] [ c ( j − a × i ) ] + d p [ i − 1 ] [ c ( j + b × i ) ] ) dp[i][j]=(dp[i-1][c(j-a×i)] + dp[i-1][c(j+b×i)]) dp[i][j]=(dp[i−1][c(j−a×i)]+dp[i−1][c(j+b×i)]),其中 c ( x ) c(x) c(x) 表示 x x x 对 n n n 取模的结果,注意负数。

坑点:

  • 注意模数是 1 0 8 + 7 10^8 + 7 108+7。

  • 注意转移方程里面的加减,别搞混了。

代码奉上:

//time:2023-04-01
#include <bits/stdc++.h>
using namespace std;
#define mod 100000007
typedef long long ll;
int n, s, a, b;
int dp[1007][1007];
inline int c(int x) {
	return (x % n + n) % n;
}
int main() {
	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][c(j - a * i)] + dp[i - 1][c(j + b * i)]) % mod;
	cout << dp[n - 1][c(s)];
	return 0;
}

标签:P8614,取模,方程,int,题解,蓝桥,ti,dp,1000
From: https://blog.csdn.net/juan_wang123/article/details/139311650

相关文章

  • 蓝桥杯-AB路线(详细原创)
    问题描述:有一个由N×M个方格组成的迷宫,每个方格写有一个字母A或者B。小蓝站在迷宫左上角的方格,目标是走到右下角的方格。他每一步可以移动到上下左右相邻的方格去。由于特殊的原因,小蓝的路线必须先走K个A格子、再走K个B格子、再走K个A格子、再走K个B格子......
  • 列队春游|概率期望|题解
    题面解析前言,此处所述为\(O(n^2)\)算法,暂时未推出\(O(n)\)的算法,后续可能会更新。题意非常明白,不多赘述。我们去考虑单个位置的概率,维护每个人放在该位置对该位置期望的贡献。以这个思想作为切入点,我们思考,对于一个序列来说,如果它的长度是定的。设总人数为n,当前我们考虑......
  • 第14届蓝桥杯B组国赛
    子2023#include<bits/stdc++.h>usingnamespacestd;usingLL=longlong;voidsolve(){ vector<int>Q; for(inti=1;i<=2023;++i){ intx=i; vector<int>tmp; while(x){ inty=x%10; if(y==2||y==0|......
  • 蓝桥杯嵌入式 第六届国赛 更新中……
    题目配置注意事项复制LCD的工程,先配置资源---勾选完选项一定要再看一眼,可能选择错误ADC:配置ADC2_IN15,对应PB15引脚EEROM,配置PB6和PB7按键输入模式PB0、PB1、PB2、PA0LED一定要使能PD2PWM互补输出,用TIM15TIM6-10ms基准定时器代码-默写大师先......
  • 【23NOIP提高组】题解
    T1:词典 #include<bits/stdc++.h>usingnamespacestd;inlineintread(){ intx=0,f=1;charch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9�......
  • P10528 [XJTUPC2024] 崩坏:星穹铁道 题解
    头图无语了,猜猜WA哪了不要真头图崩坏:星穹铁道题链这么简单做不对不许玩崩铁!题目大意给你行动的总次数\(n\)和初始战技点数量\(k\),以及编队里四名角色的行动类型,求不同行动方式的方案数。类型如下:思路先考虑dp,分角色类型讨论。设\(f_{i,k}\)表示第\(i......
  • DockerDesktop中启动jenkins容器时提示:Can not write to /var/jenkins_home/copy_ref
    场景Windows10(家庭版)中DockerDesktop(docker)的配置、安装、修改镜像源、使用:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/139264096按照以上教程搭建之后想要运行jenkins容器,所以执行如下指令dockerrun-d--namejenkins-p18088:8080-v/jenkinshome:......
  • CCF-CSP真题《202403-1 词频统计》思路+python满分题解
    哇q(≧▽≦q),第一次写博客,请大家多多关照○| ̄|_ 看到没啥人提供202403的第一题解题思路及python代码,刚好写完,心血来潮想分享解题思路,就写下了这篇博客,有其他的编码版本,欢迎大家一起探讨呀(虽然我是算法菜鸟┗(T﹏T)┛,但有问题,我会尽力回答的!!!)好了废话不多说,上解题思路!大概想了......
  • P6049 燔祭 题解
    题意:计算满足如下条件的带标号有根树数量:这棵树一共有\(n\)个节点。每个节点都有一个整数权值,且在区间\([1,m]\)内。每个节点的权值都不大于其父节点的权值。\(n,m\le400\)思路:好题。对于这种计数问题,肯定第一眼会想到\(dp\),我们设\(f_{n,m}\)表示\(n\)个点......
  • ICPC2024昆明邀请赛 J The Quest for El Dorado 题解
    QuestionTheQuestforElDorado有一个王国,有\(n\)个城市和\(m\)条双向铁路连接这些城市。第\(i\)条铁路由第\(c_i\)家铁路公司运营,铁路的长度为\(l_i\)。你想要环游这个国家,从城市\(1\)出发。为了你的旅行,你购买了\(k\)张火车票。第\(i\)张火车票用两个整数\(......