509迷宫

news/2024/11/15 9:34:02/文章来源:https://www.cnblogs.com/Cyan0826/p/18402311

想法还是太过于巧妙了。

首先有一个很简单的容斥 \(n^2\) 做法。

然后我们能发现 \(mod\) 很小,注意:\(\forall_{1 \le i < mod}\) \(C_{mod}^{i} = 0\)

所以就有个天才的做法,将矩阵沿着对角线切开,类似这样:

image

如果我们每隔 \(mod\) 进行一次切割,那么我们就会发现如果把第 \(i\) 条对角线转移到 第 \(i+1\) 条的话,就像这样:

image

我们发现对于 \((x,y)\) 只需要转移到 \((x+mod,y)\)\((x,y+mod)\) 就行了,因为其他点的组合数为 \(0\)

所以 \(dp_{x,i}\) 表示点 \((i,x-i)\) 的方案数,然后转移就是:

  1. 对角线到对角线
  2. 对角线到障碍点
  3. 障碍点到障碍点
  4. 障碍点到对角线

分别做一下就行了。

点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read(){int x=0,f=1; char c=getchar();while(!isdigit(c)){if(c=='-') f=-1; c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48); c=getchar();}return x*f;
}
const int N=3e5+5,mod=509,M=2e5+5;
int n,a[N];
int cc[mod+5][mod+5];
inline int C(int x,int y){return cc[x][y];}
inline void init(){cc[0][0]=1;for(int i=1;i<=mod;i++){cc[i][0]=1;for(int j=1;j<=mod;j++) cc[i][j]=(cc[i-1][j]+cc[i-1][j-1])%mod;}
}int f[N],tmp[N],g[N];vector<int> s[N*2];
signed main(){n=read();for(int i=1;i<=n;i++) a[i]=read(),s[i+a[i]].push_back(i);init(),f[0]=1;for(int i=1;i<=2*n/mod;i++){int l=(i-1)*mod,r=i*mod;int pl=max(0ll,l-n),pr=min(l,n);int ll=max(0ll,r-n),rr=min(r,n);//line to linefor(int j=ll;j<=rr;j++){tmp[j]=f[j];if(j>=mod) (tmp[j]+=f[j-mod])%=mod; }for(int j=l+1;j<=r;j++){for(auto x:s[j]){int L=l-a[x],R=x;//point to pointfor(int k=L;k<R;k++) if(l<k+a[k]&&k+a[k]<=r&&a[k]<=a[x]) (g[x]-=g[k]*C(x-k+a[x]-a[k],x-k))%=mod; //(k,a[k]) (x,a[x])//line to pointfor(int k=max(pl,L);k<=min(R,pr);k++) (g[x]+=f[k]*C(x+a[x]-l,x-k))%=mod; //(k,(i-1)*mod-k) (x,a[x])g[x]=(g[x]+mod)%mod;//point to lineL=x,R=r-a[x];for(int k=max(L,ll);k<=min(R,rr);k++) (tmp[k]-=g[x]*C(r-a[x]-x,k-x))%=mod; //(x,a[x]) (k,i*mod-k)}}for(int i=0;i<=rr;i++) f[i]=(tmp[i]+mod)%mod,tmp[i]=0;}cout<<(f[n]+mod)%mod<<'\n';
}
/*
5
2 4 1 1 2 
*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/793812.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

尿素

大周期看在走2浪的回调

零基础学习地平线 征程6 QAT 量化感知训练

1. 背景 首先感谢地平线工具链用户手册和官方提供的示例,给了我很大的帮助,特别是代码注释写了很多的知识点,超赞!要是注释能再详细点,就是超超赞了!下面开始正文。 最近想着学 QAT(量化感知训练)玩玩,大体看了一下地平线的用户手册,不说精度调优之类比较复杂的,光一个…

征程 6E/M 快速上手实战 Sample-PYM

01 IPC模块简述 1.1 硬件数据流 PYM(Pyramid)作为一个硬件加速模块(图像缩小及 ROI 提取),对输入的图像按照金字塔图层的方式处理,并输出到 DDR:PYM 模块在 Camsys 子系统的数量和位置如下,总共 3 个 PYM 硬件,PYM0、PYM1、PYM4(只支持 offline)。1.2 PYM-Sample 软…

#CAMA | 以视觉为中心的静态地图元素标注方法

01 现有标注方法的局限性 在自动驾驶领域,静态地图元素的精确标注是实现高精度环境感知的关键。然而,现有的公共数据集在一致性和准确性方面存在局限,无法满足日益增长的高精度训练数据需求。图一展示了 nuScenes 数据集中的默认高清地图无法在一致性和准确性两个方面提供准…

巧手打字通-在线打字练习网站功能大全

巧手打字通 Hello,大家好,今天来给大家介绍一个实用的在线打字练习网站。就是我们看到的“巧手打字通”。一个专为打字初学者,特别是中小学生量身设计的专业性平台。 打开网站,我们可以看到,整个网站的课程设计主要分为:入门课程,学拼音,说英语,读诗词,弹钢琴,玩游戏…

大模型API实战-console.bce.baidu.com/qianfan/

百度千帆大模型平台API调用实战 需要注册并实名制,然后到模型服务-->模型推理,选择可以免费开通的模型开通(其他都是收费的有坑)ACCESS_KEY、SECRET_KEY 和 AK、SK的获取 ACCESS_KEY、SECRET_KEYpython调用 # 安装包(Python >= 3.7):pip install qianfan import os …

main() 方法

根据 Java 语言规范,main() 方法必须被申明为 public。在 Java 1.4 及之后的版本中,Java 解释器强制要求 main() 方法必须是 public。 Java 语言规范(Java Language and Virtual Machine Specifications) public:被 JVM 调用,访问权限足够大。 static:被 JVM 调用,不用…

敏捷开发中的类型关系

​​ 欢迎来到我的博客:计算机软件技术总结 ‍

Linux(centos)安装安全狗

Step1:下载linux安全狗 在安全狗官网直接下载软件安装包(.tar.gz 格式:safedog_linux64.tar.gz)使用finalshell将文件发送到centos指定文件夹 [root@localhost ~]# ls anaconda-ks.cfg original-ks.cfg safedog_linux64.tar.gz vulhubStep2:解压并安装 解压缩safedog_lin…

小程序授权登录前后端对接及用户信息完善

对接后台登录流程 微信官方早都已经禁止开发者直接通过 api 获取用户信息数据了,大家拿个用户的 openid 注册好,剩下的让用户填写就行了。 先上官方的经典登录流程图:步骤拆分解析:前端通过 调用官方 API wx.login,将回调中的 code 临时登陆凭证传递给(请求)后台 后台去…

Zabbix03 Zabbix自动化运维和性能优化高可性, Zabbix用Grafana图形展示

Zabbix 网络发现 专门有个进程扫描机器,比较耗资源,不太好(除非公司不大,添加的主机不多)Zabbix 自动注册 资源消耗少。agent必须是主动模式Zabbix API 实现自动化运维 先登录获取token,再携带token获取其他资源Zabbix 优化可以查看队列了解 Zabbix 性能状态 #web网页左侧…

第十四讲:答疑文章(一):日志和索引相关问题

第十四讲:答疑文章(一):日志和索引相关问题 简概:​ 到目前为止,我已经收集了 47 个问题,很难通过今天这一篇文章全部展开。所以,我就先从中找了几个联系非常紧密的问题,串了起来,希望可以帮你解决关于日志和索引的一些疑惑。而其他问题,我们就留着后面慢慢展开吧。…