首页 > 其他分享 >ABC 335 F Hop Sugoroku

ABC 335 F Hop Sugoroku

时间:2024-07-05 20:52:34浏览次数:17  
标签:ABC const 335 复杂度 mmm int Hop 转移 dp

题意
https://atcoder.jp/contests/abc335/tasks/abc335_f

题解
显然想到dp,我们首先会产生一个最为朴实的想法,我们设dp[i]为以第i格作为结尾的方案数。那么考虑状态转移,有:dp[i]=∑dp[j](1≤j<i,i≡j(mod a[j]))。这样的做法显然是N方的,不能通过。考虑优化,我们已知a[i]≤2e5的,那么我们考虑一点:i≡j(mod a[j])的另一种表示方法是i=j+k*aj那么这个枚举时间复杂度是O(N/a[i])的,当a[j]很大时,枚举的次数其实是很少的。而考虑dp的另外一种转移:我们现在令b[i][j]表示在模i余j时这个位置的方案数,这或许很绕,我们形式化解释一下:现在有所有的位置x,且x满足x%i==j,那么b[i][j]=∑dp[x]。注意这里的x不是指某一个位置,而是一群满足性质的位置集合这个要在过程中进行,不可预处理。
现在考虑其时间复杂度,对于现在某个要转移的dp[i],其余数个数是O(a[i])级别的,那么这个转移是O(a[i])的。所以如果我们穿插两种方法进行所有位置的状态转移,总的时间复杂度为:O(N(N/V+V)),求导可以得到最优时间复杂度:当我们设置阈值为V=sqrt(N),那么总的时间复杂度为O(Nsqrt(N)),可以通过,这也是所说的根号分治。具体实现的话对于当前要转移的dp[i],如果当前位置的a[i]大于等于V,那么我们采取第一种转移方法(可用刷表法实现);对于小于V的情况,我们采取第二种转移方法。
在转移之前,先把dp[i]用第二种方法给算出来。剩下的细节就看代码吧

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod=998244353;
const int maxn=1e6+10;
const int mmm=1e3+10;
int n;
int a[maxn],dp[maxn],b[mmm][mmm];

signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	
	cin>>n;
	int ans=0;
	int s=sqrt(n);
	dp[1]=1;
	for(int i=1;i<=n;i++)
	{
		int a;
		cin>>a;
		for(int j=1;j<=s;j++)
		   dp[i]=(dp[i]+b[j][i%j])%mod;
		if(a<=s)  b[a][i%a]=(b[a][i%a]+dp[i])%mod;
		else 
		{
			int p=i;
			while(p+a<=n)
			{
				p+=a;
				dp[p]=(dp[p]+dp[i])%mod;
			}
		}
		ans=(ans+dp[i])%mod;
	}
	
	cout<<ans;
	
	
	return 0;
 } 

标签:ABC,const,335,复杂度,mmm,int,Hop,转移,dp
From: https://www.cnblogs.com/lulu7/p/18286590

相关文章

  • 【国赛赛题详解】2024年数学建模国赛ABCDEF题(点个关注,后续会更新)
        您的点赞收藏是我继续更新的最大动力!一定要点击如下的蓝色字体链接,那是获取资料的入口!点击链接加入群聊【2024国赛资料合集】:http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=eQt5WRIvc5-fogZRrrahAhbqDa2nKfW8&authKey=%2BqQfThTxNnhw5LGJFRIcneF8JXBj1ufd2K01UpKPrpcg......
  • F28335的中断
    F28335采用的是三级中断,分别为外设级、PIE级、CPU级。最重要的是CPU级中断,CPU只能响应从CPU中断线上过来的中断请求。外设想要成功产生一个中断,需要先经过外设级中断允许,接着PIE中断允许,然后CPU允许,最终才会产生如上图所示中断响应过程可以分为两个部分,下边为PIE小组响应外......
  • Registry Workshop —— 强大的注册表编辑工具
    RegistryWorkshop——强大的注册表编辑工具简介RegistryWorkshop是一款高级的注册表编辑工具,除了RegEdit的特性外,RegistryWorkshop提供许多其他功能提高注册表编辑操作效率:能够剪切,复制和粘贴注册项和键值名,还可以进行撤销和重做操作;能够快速地查找和替换所需注册......
  • Atcoder ABC091D Two Sequences
    首先根据\(\operatorname{xor}\),就想到拆成二进制的\(a_{i,w},b_{i,w}\)来处理。类似竖式加法,考虑把得到的结果\(c_{w}\)分为\(a_{i,w}+b_{j,w}+x\),其中\(x\)就是上一位的进位。进一步的,发现对于总的\(c_{w}\),\(a_{i,w},b_{j,w}\)肯定都在这个位置加了\(......
  • D - Intersecting Intervals(abc355)
    题意:有n个区间,找出俩俩区间相交的个数分析:设初始俩俩相交,找出不相交的(不同区间l>r),减去即可#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;intmain(){   ios::sync_with_stdio(false);   intn,l[n+10],r[n+10];   cin>>n;  ......
  • P3350 [ZJOI2016] 旅行者
    咕了2天才写的题解还是比较经典的题目,分治处理网格图最短路离线下来,利用分治的思想,用一条线把网格图平均劈成两半,每次只考虑询问在两块的一对点,所有的线必须经过直线上的一个点,于是我把线上所有点都在规定范围内跑一次dijkstra,最后直接算答案,显然我想让最短路跑的次数最小,每次选......
  • 【国赛赛题详解】2024年数学建模国赛ABCDEF题(点个关注,后续会更新)
        您的点赞收藏是我继续更新的最大动力!一定要点击如下的蓝色字体链接,那是获取资料的入口!点击链接加入群聊【2024国赛资料合集】:http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=eQt5WRIvc5-fogZRrrahAhbqDa2nKfW8&authKey=%2BqQfThTxNnhw5LGJFRIcneF8JXBj1ufd2K01UpKPrpcg......
  • 【国赛赛题详解】2024年数学建模国赛ABCDEF题(点个关注,后续会更新)
        您的点赞收藏是我继续更新的最大动力!一定要点击如下的蓝色字体链接,那是获取资料的入口!点击链接加入群聊【2024国赛资料合集】:http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=eQt5WRIvc5-fogZRrrahAhbqDa2nKfW8&authKey=%2BqQfThTxNnhw5LGJFRIcneF8JXBj1ufd2K01UpKPrpcg......
  • 「杂题乱刷」AT_abc360_d
    题目链接AT_abc360_d(luogu)AT_abc360_d(atcoder)解题思路一个性质是,往左边走的蚂蚁无论怎么样都追不到左边的蚂蚁,而往右边走的蚂蚁无论怎么样都追不上右边的蚂蚁。因此我们考虑将蚂蚁分为往左往右走的两堆。发现对于每个蚂蚁都能走过一段区间,因此直接二分将右端点减去左......
  • abc360 E 题解
     E对于位置2~n,它们的概率是相等的。n*n个(x,y)对。其中x可以等于y。 对于x/y,y的逆元rev(y)为mul(y,mod-2)。加、减、乘、除都可以做。比如48/9和16/3的结果是一样的,48*rev(9)%mod=16*rev(3)%mod。比如3*rev(2)%mod=(rev(2)+rev(2)+rev(2))%mod. 对于每次操作,有多少......