首页 > 其他分享 >[ABC258Ex] Odd Steps 题解

[ABC258Ex] Odd Steps 题解

时间:2024-07-16 21:10:13浏览次数:14  
标签:tmp begin mat int 题解 sum ABC258Ex Steps dp

思路

拿到这道题,第一时间肯定想到是 \(dp\) 题目。

朴素 DP

用 \(dp_i\) 表示序列和为 \(i\) 的序列个数。因为原数组由奇数组成,所以 \(dp\) 只可能由 \(dp_{i-1}\),\(dp_{i-3}\) 等等转移过来,若 \(i\in A\),\(dp_i=0\)。即:

\[dp_i=\begin{cases} 0&i\in A\\ dp_{i-1}+dp_{i-3}+\cdots &otherwise \end{cases} \]

优化

设 \(sum_i=f_i+f_{i-2}+f_{i-4}+\cdots\)。则 $f_i=sum_{i-1} \(,\)s_i=s_{i-2}+f_i$。

观察式子发现可以使用矩阵优化递推,我们维护 \(f_i\),\(sum_{i-1}\),\(sum_{i-2}\) 的值。

因为 :

\[\left\{\begin{matrix} f_{i+1}=f_i+s_{i-2}\\ s_{i}=f_{i}+s_{i-2}\\ s_{i-2}=s_{i-2} \end{matrix}\right. \]

所以可以构造如下矩阵:

\[\begin{bmatrix} f_i & s_{i-1} &s_{i-2} \end{bmatrix} \begin{bmatrix} 1 & 1 &0 \\ 0 & 0 & 1\\ 1 & 1&0 \end{bmatrix} \]

所以之后分段快速幂即可,剩下的看我代码吧。

代码

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=3, mod=998244353;
int a[100010];

struct mat {
	int a[maxn+1][maxn+1];
	mat() {
		memset(a,0,sizeof(a));
	}
	mat operator*(const mat&T) const {
		mat res;
		for(int i=1;i<=maxn;i++) {
			for(int j=1;j<=maxn;j++) {
				for(int k=1;k<=maxn;k++) {
					res.a[i][j]=(res.a[i][j]+a[i][k]*T.a[k][j])%mod;
				}
			}
		}
		return res;
	}
	mat operator^(int x) const {
        mat bas,res;
        for(int i=1;i<=maxn;i++) res.a[i][i]=1;
        for(int i=1;i<=maxn;i++) {
            for(int j=1;j<=maxn;j++) {
                bas.a[i][j]=a[i][j]%mod;
            }
        }
        while(x) {
            if(x&1) {
                res=res*bas;
            }
            bas=bas*bas;
            x>>=1;
        }
        return  res;
    }
};
mat x,y,tmp;
signed main() {
	x.a[1][1]=1, x.a[1][2]=0,x.a[1][3]=0;
	int n,s;
	cin>>n>>s;
	y.a[1][1]=y.a[1][2]=y.a[2][3]=y.a[3][2]=y.a[3][1]=1;
	for(int i=1;i<=n;i++) {
		cin>>a[i];
		tmp=y^(a[i]-a[i-1]);
		x=x*tmp;
		x.a[1][1]=0;
	} 
	mat tmp=y^(s-a[n]);
	x=x*tmp;
	cout<<x.a[1][1];
	return 0;
}

标签:tmp,begin,mat,int,题解,sum,ABC258Ex,Steps,dp
From: https://www.cnblogs.com/merlinkkk/p/18306104

相关文章

  • CF1859A题解
    CF1859A题解思路考虑一种极端情况,\(b\)数组内的数全部比\(a\)大,这样也无法整除,所以这就是这道题的突破口。我们让\(b\)数组内的数全部比\(a\)里的大,最方便的实现方法就是把原数组内的最大的数放进\(b\)数组,剩下的放进\(a\)数组。注意特判无解情况:原数组内的数一样,这......
  • [ABC352D]题解
    题意在长为\(n\)的序列\(a\)中找出\(k\)个数,设它们的下表为$p_1\(,\)p_2$到\(p_k\),满足这\(k\)个数从小到大排列过后是一个公差为\(1\)的等差数列。求满足条件的\(k\)个数的最大的\(p\)减去最小的\(p\)最小。输出这个值。思路把数组\(a\)排一遍序,滑动窗......
  • [ABC352E]题解
    思路这里提供一种暴力做法。方法就是当边数到达一个值过后就不加边了。我取的值是\(500000\),实际上可以开大一些,只要\(x\logx\)不超时就行了。代码赛时提交记录#include<bits/stdc++.h>usingnamespacestd;#defineintlonglonginta[200020];intcnt;structrec......
  • P10378 [GESP202403 七级] 交流问题题解
    思路我们把关系想成一张图,每次输入就给两个人连一条边。因为一个人只有两种选择,所以我们在一个联通块内随便找一个点,跑一遍搜索,找出这个联通块内的答案。代码如下。voiddfs(intu,intcolor){cnt2++;//cnt2是这个连通块内的总点数cnt1+=color;//这个是一所学校内......
  • 【题解】金明的预算方案
    原题传送门题目描述金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间。更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过\(n\)元钱就行”。今天一早,金明就开始做预算了,他把想买的物品分为两类:主件与附件,附......
  • P5537 题解
    blog。今天在XDFZ听ljy讲的串串(?)题,瞎写写就混了个最优解,来发个题解(注意到树的形态不变,所以可以记录兄弟间的编号rank。每个点就可以表示为若干rank构成的路径,例如下图:然后将每个点的这个路径压成hash,记为\(H_i\),并丢进map里。假设从\(x\)开始,可以完全遍历完\(a_......
  • C++题解(7) 信息学奥赛一本通:1055:判断闰年
    【题目描述】判断某年是否是闰年。如果公元a年是闰年输出Y,否则输出N。【输入】输入只有一行,包含一个整数a(0<a<3000)。【输出】一行,如果公元a年是闰年输出Y,否则输出N。【输入样例】2006【输出样例】N【知识链接:如何判断闰年】(1)能被4整除,但不......
  • C++题解(6) 信息学奥赛一本通:2069:【例2.12 】糖果游戏
    【题目描述】某幼儿园里,有5个小朋友编号为1、2、3、4、5,他们按自己的编号顺序围坐在一张圆桌旁。他们身上都有若干个糖果(键盘输入),现在他们做一个分糖果游戏。从1号小朋友开始,将自己的糖果均分三份(如果有多余的糖果,则立即吃掉),自己留一份,其余两份分给他的相邻的两个小朋友。......
  • CF141B Hopscotch 题解
    Hopscotch题面翻译有nnn个形状和大小都一致的正方体积木,积木堆积的样式是第一层只有一个正方体,然后上面就开始循环了,循环体为:第一层是一个正方体,第二层是两个正方体。......
  • AT_dp_a Frog 1 题解
    Frog1题面翻译NNN个石头,编号为1,2......