window.cnblogsConfig = {//可以放多张照片,应该是在每一个博文上面的图片,如果是多张的话,那么就随机换的。 homeTopImg: [ "https://cdn.luogu.com.cn/upload/image_hosting/clcd8ydf.png", "https://cdn.luogu.com.cn/upload/image_hosting/clcd8ydf.png" ], }

[ABC335F] Hop Sugoroku

庆祝一下我第一次赛时 AC 了 F 题(鼓掌)。

这道题第 1 秒就可以看出是道 dp 的题,并且状态肯定是 dp[i] 表示最后一个黑色块在 i 的状态的个数。问题无非在于如何转移状态。

很容易想到两种转移方法:

  1. 暴力转移法:对于每一个 i,我们直接暴力将每一个 i+ai×k 进行加法。
  2. 数组记录法:对于每一个 iai,我们使用一个数组 cnt 记录,其中 cnt[i][j] 表示有 ai=i 且开始位置为形如 j+i×kk 为整数)的方案总数。然后对于每个 i ,我们直接用 cnt 里的数累加。

可如上两种方法各有一个问题。暴力转移法由于 ai 最小为 1,则一次最多会跳 2×105 次,外面还有循环,必超时。数组转移法由于 ai 最大为 2×105,可数组根本开不了这么大。

这时候就有一个绝妙的想法:以 103 为分界线!

插句题外话:当时我觉得这一定是个巧妙的玄学解法,并不是正解,觉得我能想到这个方法真是个天才。赛后看到官方解法,居然也差不多是这样,更觉得我是个天才了。

那就总结一下吧:

  1. 先计算 dpi,由于大于等于 103 的部分已计入,则 dpi+=j=1103cnt[j][i%j]
  2. 对于 ai<103dp[i+ai×k]+=dp[i]
  3. 对于 ai103cnt[ai][i%a[i]]+=dp[i]

代码如下。赛时代码有点丑,将就看吧

#include <bits/stdc++.h> using namespace std; #define int long long #define pb push_back #define eb emplace_back #define all(x) (x).begin(),(x).end() #define fi first #define se second #define SZ(x) ((int)(x).size()) typedef vector<int> VI; typedef long long ll; typedef pair<int,int> PII; const ll MOD=998244353; // head const int N=2e5+5,M=1e3+5; int a[N]; int dp[N]; int cnt[M][M]; signed main() { cin.tie(nullptr); ios::sync_with_stdio(false); int n;cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; dp[1]=1; if(a[1]>=M-5) {for(int i=1+a[1];i<=n;i+=a[1]) dp[i]=1;} else cnt[a[1]][1%a[1]]=1; for(int i=2;i<=n;i++){ for(int j=1;j<=min(n,M-6);j++){ dp[i]=(dp[i]+cnt[j][i%j])%MOD; } if(a[i]>=M-5){ for(int j=i+a[i];j<=n;j+=a[i]) dp[j]=(dp[j]+dp[i])%MOD; } else cnt[a[i]][i%a[i]]=(cnt[a[i]][i%a[i]]+dp[i])%MOD; } int ans=0; for(int i=1;i<=n;i++){ ans=(ans+dp[i])%MOD; } cout<<ans<<endl; }

__EOF__

本文作者ziyistudy
本文链接https://www.cnblogs.com/ziyistudy/p/17953550.html
关于博主:S300+,NOIP1=
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   ziyistudy  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
点击右上角即可分享
微信分享提示