首页 > 其他分享 >P10812 【MX-S2-T3】跳 题解

P10812 【MX-S2-T3】跳 题解

时间:2024-07-29 14:53:39浏览次数:15  
标签:P10812 log 题解 复杂度 往回 S2 向前 sum DP

题目分析

考虑 DP。

显然当没有 \(i\) 连向 \(i+1\) 的边时,整个图是一个 DAG,可以直接 DP。所以我们 DP 要解决的唯一问题,就是考虑上 \(i\) 到 \(i+1\) 的边。

考虑从 \(n\) 走到 \(1\) 的过程。当我们从 \(i\) 向前跳到 \(j\) 后,此时我们要么向前跳,要么往回走。又因为不能经过重复点,所以往回走最多只能走到 \(j-1\)。容易发现当到达 \(i\) 点时,这个位置的状态只有当前点 \(i\) 和跳过来的点 \(j\) 两维,我们可以以此设计 DP。

我们从 \(1\) 向 \(n\) 来 DP。\(f_{i,j}\) 代表当前从 \(j\) 向前 跳到点 \(i\) 后,到 \(1\) 的路径数目。此时可以向前跳到点 \(i-1\) 或 \(i\) 的因数。可以直接转移。(注意到此时限制已经从 \(j\) 变成了 \(i\))

\[f_{i,j} = f_{i-1,i} + \sum_{y|i}f_{y,i} \]

接下来就是往回走。状态为 \(f_{i,j}\) 时,可以往回走到 \(i+1\) 到 \(j-1\) 之间的任意地方再向前跳。

\[f_{i,j} = f_{i,j} + \sum_{x=i-1}^{j+1}\sum_{(y|x) \land (y<i)}f_{y,i} \]

由于 \(y<i\) 这个限制不是很好处理,但因为我们是从 \(1\) 向 \(n\) DP,所以只需要每计算完一个 \(f\) 值就把它加到它的所有倍数上即可,将其记为 \(s_{i,j}\) ,那原式变为:

\[f_{i,j} = f_{i,j} + \sum_{x=i-1}^{j+1}s_{y,i} \]

注意到这是一个区间查询,可以使用树状数组查询,复杂度 \(O(n^2 \log^2n)\)。(因为向因数连边,边数是 \(\log n\) 级别的)

for(int i=2;i<=n+1;i++)f[1][i]=1;xiangyinshulianbian
for(int x:son[1])
	for(int j=2;j<=n+1;j++)
		Add(x,f[1][j],j);
for(int i=2;i<=n;i++){
	int bas=0;
	for(int x:fa[i]){(bas+=f[x][i])%=p;}
	(bas+=f[i-1][i])%=p;
	for(int j=i+1;j<=n+1;j++){
		(f[i][j]+=bas)%=p;
		(f[i][j]+=(Query(j-1,i)-Query(i,i)+p)%p)%=p;
	}
	for(int x:son[i])
		for(int j=i+1;j<=n+1;j++)
			Add(x,f[i][j],j);
}
printf("%d\n",f[n][n+1]);

(其中 \(son\) 是倍数,\(fa\) 是因数)

但是她 T 了,所以要优化复杂度。

观察查询的过程,发现我们完全不需要树状数组,因为移动 \(j\) 时,\(f_{i,j}\) 只会改变一个数,一边求前缀和,一边改即可。时间复杂度 \(O(n^2 \log n)\)。

代码

for(int i=1;i<=n;i++)
	for(int j=i;j<=n;j+=i)
		son[i].push_back(j),
		fa[j].push_back(i);
for(int i=2;i<=n+1;i++)f[1][i]=1;
for(int x=2;x<=n;x++)
	for(int j=2;j<=n+1;j++)s[x][j]=1;
for(int i=2;i<=n;i++){
	long long bas=0;
	for(int x:fa[i])bas+=f[x][i];
	(bas+=f[i-1][i])%=p;
	long long now=0;
	for(int j=i+1;j<=n+1;j++){
		f[i][j]+=bas+now;
		now+=(s[j][i]%=p);
	}
	for(int j=i+1;j<=n+1;j++)f[i][j]%=p;
	for(int x:son[i]){
		for(int j=i+1;j<=n+1;j++)s[x][j]+=f[i][j];
	}
}
printf("%d\n",f[n][n+1]);

标签:P10812,log,题解,复杂度,往回,S2,向前,sum,DP
From: https://www.cnblogs.com/11-twentythree/p/18330071

相关文章

  • CF30E Tricky and Clever Password 题解
    考虑先贪心中间的回文串\(b\),因为这即使影响了两边的字符串,也不会改变最终的总串长。所以先使用manacher跑出来每个位置的最长回文半径。在考虑怎样找出最长的\(a\)和\(a'\)。可以二分答案,设此时答案为\(k\),找出的\(b\)串为\(s[l\dotsr]\),那么其合法的条件就是存在\(......
  • 关于网站安全狗卸载了仍然能拦截的问题解决
    关于网站安全狗卸载了仍然能拦截的问题解决如果你将所有safedog的文件删除的话,可能会导致Apache服务启动不了例如:这里没有提示相关安全狗的信息是因为我已经删除了Apache访问safedog的配置代码,只是提醒错误信息会如上图所示。导致这种原因的结果大概率是因为Apache的conf文件......
  • 题解:P4563 [JXOI2018] 守卫
    思路解法:区间DP。本题虽标上紫题,但黄队说了:“不要被颜色所吓倒。”易得,区间\([l,r]\)中最右端的亭子\(r\)一定会有保镖。先说一下可见性判断吧,只要\(l,r\)的连线的斜率大于\(p,r\)连成的线的斜率大,\(l\)即是可见的。如图,红线是\(r\)无法看到的,而蓝线是\(r\)可......
  • CF1178D Prime Graph 题解
    首先考虑一个问题:如果没有边数是素数的限制,应该怎么构造?这其实很简单,把原图连成一个环即可,每个点度数为\(2\)。接着考虑在原图上加边,注意到\(3\)也是个素数,所以每次可以任意选两个度数为\(2\)的点连边,此时仍然符合条件。这样加边最多可以加\(\left\lfloor\frac{n}{2}\rig......
  • CF685E 题解
    吐槽一下,为啥这道题\(\mathcal{O}(nm)\)可以过。联考的时候做到了这道题,还一直在想更快的算法。。。然后,这联考的数据是自己出的,有\(s=t\)的情况,我反正是完全没有想到,又因为是捆绑测试,直接痛失\(100pts\)。首先考虑转化一下题目。对于一个询问\(l,r,s,t\),就相当于是让你......
  • P4468[SCOI2007]折纸-题解
    题意:有一个左下角为\((0,0)\),右上角为\((100,100)\)的正方形,给你\(n\)个有向线段和\(m\)个询问,将纸片依次按直线折叠,然后每次询问让你求出某个点上有多少层纸。分析:观察到数据范围非常小,于是可以直接对于每个询问\(\mathcal{O}(2^n)\)来求。具体的,对于每一个点,倒着枚......
  • P8540 「Wdoi-2」夜空中的 UFO 恋曲 题解
    hanghangakioi考试的时候在乱猜结论,交了几遍就过了,证明当然是赛后才想的()文中加粗部分是需要读者稍微思考一下原因的地方(不是重点)。先考虑一下样例二,将\(10^{18}\)化成二进制:\(1101...001000000000000000000\)。其实只需要知道末尾有\(18\)个\(0\)就行了,因为在\(x\)......
  • CF1906C Cursed Game 题解
    题目大意交互库有一个\(3\times3\)的01矩阵\(a\),每次询问一个\(n\timesn\)的01矩阵\(b\),交互库会返回一个\((n-2)\times(n-2)\)的01矩阵\(c\),满足:\[c_{x,y}=\bigoplus\limits_{1\lei,j\le3}\left(a_{i,j}\operatorname{AND}b_{x+i-1,y+j-1}\right......
  • franka ros2
    franka_ros2在Windows上不受支持。franka_ros2repo包含libfranka的ROS2集成 。 警告:franka_ros2正在快速开发中。预计会出现重大变化。在 GitHub上报告错误。先决条件ROS2Humble安装( ros-humble-desktop)或带有DevContainer的VSCodeIDE。PREEMPT_RT......
  • 梦熊十三连测第三场题解
    T1本题考察了数论的相关知识。30pts暴力枚举每次洗牌的情况,时间复杂度为\(O(n^2)\)。60pts首先卡牌\(1\)和\(2n\)一直不动,可以不用考虑这两张牌。将位置和剩下的牌上的数字全减\(1\),那么数字为\(k\)的牌操作一次后就会到\(2k\bmod(2n-1)\)的位置。那么问题相当......