当前位置: 首页 > news >正文

微信步数C++

题目:

 


样例解释:

【样例 #1 解释】

从 (1,1) 出发将走 2 步,从 (1,2) 出发将走 4 步,从 (1,3) 出发将走 4 步。
从 (2,1) 出发将走 2 步,从 (2,2) 出发将走 3 步,从 (2,3) 出发将走 3 步。
从 (3,1) 出发将走 1 步,从 (3,2) 出发将走 1 步,从 (3,3) 出发将走 1 步。
共计 21 步。

 


思路:

先考虑O(nkw)O(nkw)的30分暴力。

显然,每个维度上走过的位置是一个区间。

只要走的步数确定,那么这个区间关于起点位置的相对位置也就确定了。

只要先算出每个循环向左/右所走的最远距离,以及一个循环的移位即可。

这样,考虑一个算法:

枚举走了多少步结束,并算出贡献(就是算出满足条件的起点数目)。

先枚举走出区域的上一步,走到了循环节中的哪个位置,以及走了多少循环节。

由于不能走出区域,于是可以根据每个维度的区间来算出这个维度的起点所在区间。

设下一步修改的维度为cc。根据对应的dd,容易算出这个维度的起点位置。

那么,这个位置必须在起点区间内。

满足这个条件的基础上,把其他维度的起点区间长度相乘就是起点数目。

考虑优化:

这个算法的主要瓶颈在于对循环节数的枚举。

设走过的循环节数目为xx。

那么,不难发现,每个维度的区间的相对位置(即左右端点与起点的距离)是关于xx的一次函数。

由于这一维度的方案数等于w+1w+1减去区间长度,因此这也是关于xx的一次函数。

根据这个区间长度为正数,可以得出xx的取值范围。

同时,维度cc的起点位置也是关于xx的一次函数。

根据这个位置必须在起点区间内部,进一步缩小xx的取值范围。

这样,答案就是对于每个xx,这些一次函数在xx处的值的乘积的和。

暴力进行多项式乘法并用自然数幂前缀和即可。

时间复杂度O(nk2)O(nk2)。

注意这个写法,可能要对x=0x=0进行特判。

 

 


代码:

#include <stdio.h>
#define inf 1999999999
#define md 1000000007
#define min(a,b) a<b?a:b
#define max(a,b) a>b?a:b
int az[12],al[12],ar[12],w[12],aa[500010][12];
int B[12],C[500010],D[500010],la[500010][12],ra[500010][12];
int ksm(int a,int b) {int jg=1;while(b>0) {if(b&1)jg=1ll*jg*a%md;a=1ll*a*a%md;b=(b>>1);}return jg;
}
int Cc[12][12],xs[12][12];
void GetB(int k)//伯努利数 
{B[0]=1;for (int i=1;i<=k+1;i++) {for (int j=0;j<=i;j++) {if(j==0||j==i)Cc[i][j]=1; else Cc[i][j]=(Cc[i-1][j]+Cc[i-1][j-1])%md;}}for (int i=1;i<=k;i++) {int h=0;for (int j=0;j<i;j++)h=(h+1ll*Cc[i+1][j]*B[j])%md;B[i]=1ll*(md-h)*ksm(i+1,md-2)%md;}for (int i=1;i<=k;i++) {int ny=ksm(i+1,md-2);for (int j=0;j<=i;j++)xs[i][i+1-j]=1ll*Cc[i+1][j]*B[j]%md*ny%md;}
}
struct SLi//一次函数 
{int k,b;SLi() {}SLi(int K,int B) {k=K;b=B;}SLi(int Z) {k=0;b=Z;}
};
SLi operator-(const SLi &x,const SLi &y) {return SLi(x.k-y.k,x.b-y.b);
}
int Sum(int k,int n) {if(k==0)return n+1;int jg=0;for (int i=0,j=1;i<=k+1;i++) {jg=(jg+1ll*j*xs[k][i])%md;j=1ll*j*(n+1)%md;}return jg;
}
struct DXS//多项式 
{int sz[12],n;void operator=(const DXS &a) {n=a.n;for (int i=0;i<=n;i++)sz[i]=a.sz[i];}void clear() {for (int i=1;i<=10;i++)sz[i]=0;sz[0]=1;n=0;}int sum(int l,int r) {int ans=0;for (int i=0;i<=n;i++) {int t=(Sum(i,r)-Sum(i,l-1)+md)%md;ans=(ans+1ll*sz[i]*t)%md;}return ans;}
};
DXS operator*(const DXS&x,const SLi&y) {DXS rt;rt.n=x.n+1;rt.sz[rt.n]=0;for (int i=0;i<=x.n;i++)rt.sz[i]=1ll*y.b*x.sz[i]%md;for (int i=0;i<=x.n;i++)rt.sz[i+1]=(rt.sz[i+1]+1ll*y.k*x.sz[i])%md;return rt;
}
struct SQj//维护区间 
{int l,r;SQj() {}SQj(int L,int R) {l=L;r=R;}
};
SQj jiao(const SQj&a,const SQj&b) {return SQj(max(a.l,b.l),min(a.r,b.r));
}
int floor(int,int);
int ceil(int x,int y) {if(y<0)x=-x,y=-y;if(x>=0)return (x+y-1)/y;return -floor(-x,y);
}
int floor(int x,int y) {if(y<0)x=-x,y=-y;if(x>=0)return x/y;return -ceil(-x,y);
}
SQj Less(SLi a,SLi b) {int x=a.k-b.k,y=b.b-a.b;if(x==0)return y>=0?SQj(-inf,inf):SQj(inf,-inf);if(x>0)return SQj(-inf,floor(y,x));return SQj(ceil(y,x),inf);
}
SQj More(SLi a,SLi b) {int x=a.k-b.k,y=b.b-a.b;if(x==0)return y<=0?SQj(-inf,inf):SQj(inf,-inf);if(x>0)return SQj(ceil(y,x),inf);return SQj(-inf,floor(y,x));
}
int cal0(int n,int i,int k) {int l[12],r[12],jg=1;for (int c=1;c<=k;c++)l[c]=la[i][c],r[c]=ra[i][c];for (int c=1;c<=k;c++) {int zl=1-l[c],zr=w[c]-r[c];if(c!=C[(i+1)%n]) {int s=zr-zl+1;if(s<0)s=0;jg=1ll*jg*s%md;} else {int t=aa[i][c],s=0;if(D[(i+1)%n]==1) {int o=w[c]-t;if(o>=zl&&o<=zr)s=1;} else {int o=1-t;if(o>=zl&&o<=zr)s=1;}jg=1ll*jg*s%md;}}return 1ll*(i+2)*jg%md;
}
int main() {int n,k;scanf("%d%d",&n,&k);GetB(k);for (int i=1;i<=k;i++)scanf("%d",&w[i]);for (int i=0;i<n;i++) {scanf("%d%d",&C[i],&D[i]);if(i>0) {for (int j=1;j<=k;j++)aa[i][j]=aa[i-1][j];}aa[i][C[i]]+=D[i];//循环节中某一前缀的偏移量az[C[i]]+=D[i];if(az[C[i]]<al[C[i]])//最左移位al[C[i]]=az[C[i]];if(az[C[i]]>ar[C[i]])//最右移位ar[C[i]]=az[C[i]];for (int j=1;j<=k;j++) {la[i][j]=al[j];ra[i][j]=ar[j];}}bool zd=false;for (int i=1;i<=k;i++) {if(az[i]!=0||ar[i]-al[i]>=w[i]) {zd=true;break;}}if(!zd)//走不出去 {printf("-1");return 0;}int ans=1;for (int i=1;i<=k;i++) {if(i!=C[0])ans=1ll*ans*w[i]%md;}for (int i=0;i<n;i++) {ans=(ans+cal0(n,i,k))%md;//特殊处理x=0的情况SLi l[12],r[12],d[12];for (int c=1;c<=k;c++)//算出对应维度的一次函数 {if(az[c]>=0) {l[c]=al[c];int t=az[c]+ra[i][c];if(ar[c]>t)t=ar[c];r[c]=SLi(az[c],t-az[c]);} else {r[c]=ar[c];int t=az[c]+la[i][c];if(al[c]<t)t=al[c];l[c]=SLi(az[c],t-az[c]);}d[c]=r[c]-l[c];}int tc=C[(i+1)%n];SLi o;SLi tz=SLi(az[tc],aa[i][tc]);if(D[(i+1)%n]==1)o=w[tc]-tz; else o=1-tz;SLi zl=1-l[tc],zr=w[tc]-r[tc];//tc这一维度起点的范围SQj qj=jiao(More(o,zl),Less(o,zr));//tc这一维度起点是确定的,需要满足条件for (int i=1;i<=k;i++) {d[i]=w[i]-d[i];qj=jiao(qj,More(d[i],1));//方案数>0}qj=jiao(qj,SQj(1,inf));if(qj.l>qj.r)continue;DXS ji;ji.clear();ji=ji*SLi(n,i+2);for (int c=1;c<=k;c++)//对应维度相乘 {if(c!=tc)ji=ji*d[c];}ans=(ans+ji.sum(qj.l,qj.r))%md;}printf("%d",(ans%md+md)%md);return 0;
}

相关文章:

微信步数C++

题目&#xff1a; 样例解释&#xff1a; 【样例 #1 解释】 从 (1,1) 出发将走 2 步&#xff0c;从 (1,2) 出发将走 4 步&#xff0c;从 (1,3) 出发将走 4 步。 从 (2,1) 出发将走 2 步&#xff0c;从 (2,2) 出发将走 3 步&#xff0c;从 (2,3) 出发将走 3 步。 从 (3,1) 出发将…...

AI写作工具大比拼:揭秘Claude的神秘魅力以及如何订阅Claude

AI写作困境与Claude的惊喜表现 最近有很多朋友在吐槽AI写的文章不太行&#xff0c;我一看他的要求写的很清楚&#xff0c;已经把提示词都用到位了&#xff0c;例如&#xff1a;写作背景、写作要求等&#xff0c;都有具体写出来。但文章阅读起来就是欠缺点啥。 你们有没有遇到…...

秋招内推2025-招联金融

【投递方式】 直接扫下方二维码&#xff0c;或点击内推官网https://wecruit.hotjob.cn/SU61025e262f9d247b98e0a2c2/mc/position/campus&#xff0c;使用内推码 igcefb 投递&#xff09; 【招聘岗位】 后台开发 前端开发 数据开发 数据运营 算法开发 技术运维 软件测试 产品策…...

GOM引擎启动后M2提示Invalid filename报错的解决办法

在架设一个GOM引擎版本的时候&#xff0c;启动M2就提示Invalid filename&#xff0c;之后的网关就没有办法再启动了&#xff0c;研究了半天也终于是弄好了&#xff0c;其实也简单&#xff0c;就是路径设置的不对&#xff0c;所以无法完成启动&#xff0c;很多人以为在控制台设置…...

CPU 多级缓存

在多线程并发场景下&#xff0c;普通的累加很可能错的 CPU 多级缓存 Main Memory : 主存Cache : 高速缓存&#xff0c;数据的读取存储都经过此高速缓存CPU Core : CPU 核心Bus : 系统总线 CPU Core 和 Cache 通过快速通道连接&#xff0c;Main menory 和 Cache 都挂载到 Bus 上…...

Chrome浏览器调用ActiveX控件--allWebOffice控件功能介绍

allWebOffice控件概述 allWebOffice控件能够实现在浏览器窗口中在线操作文档的应用&#xff08;阅读、编辑、保存等&#xff09;&#xff0c;支持编辑文档时保留修改痕迹&#xff0c;支持书签位置内容动态填充&#xff0c;支持公文套红&#xff0c;支持文档保护控制等诸多办公功…...

JavaScript-下篇

上篇我们学习了&#xff0c;一些基础语法和函数&#xff0c;现在我们学习下篇&#xff0c;主要包括,对象和事件。而对象又包括&#xff0c;数组Arrays&#xff0c;String字符串&#xff0c;BOM&#xff0c;DOM等 JS对象 Arrays数组 数组是一种特殊的对象&#xff0c;用于存储…...

STM32-HAL库驱动DHT11温湿度传感器 --2024.9.28

目录 一、教程简介 二、驱动原理讲解 &#xff08;一&#xff09;通信4步骤 &#xff08;二&#xff09;传感器数据解析 三、CubeMX生成底层代码 &#xff08;一&#xff09;基础配置 &#xff08;二&#xff09;配置DHT11的驱动引脚 &#xff08;三&#xff09;配置串口 四…...

使用C语言获取iostat中的await值的方法和方案

使用C语言获取iostat中的await值的方法和方案 1. 准备工作2. 调用iostat命令并获取输出3. 解析iostat输出4. 完整实现和错误处理5. 注意事项在Linux系统中,iostat命令是sysstat软件包的一部分,用于监控系统的CPU、网卡、tty设备、磁盘、CD-ROM等设备的活动情况和负载信息。其…...

阿里云域名解析和备案

文章目录 1、域名解析2、新手引导3、ICP备案 1、域名解析 2、新手引导 3、ICP备案...

gitee公钥设置、创建库及使用

简介 一、如何安装git 使用gitee&#xff0c;需要先安装git工具。 工具网站地址&#xff1a;https://git-scm.com/downloads 安装完成后&#xff0c;在terminal命令行输入git --version可以查看到git的版本。 二、登录gitee 我们先在 gitee上注册账号并登录。gitee官网&#x…...

融媒体服务中PBO进行多重采样抗锯齿(MSAA)

如果不理解pbo 那先去了解概念&#xff0c;在此不再解释&#xff0c;这是我为了做融合服务器viewpointserver做的一部分工作&#xff0c;融合服务器的功能是将三维和流媒体&#xff0c;AI融合在一起&#xff0c;viewpointserver会直接读取三维工程的文件&#xff0c;同时融合rt…...

说说BPMN概念及应用

BPMN&#xff08;Business Process Modeling and Notation&#xff09;即业务流程建模与标注&#xff0c;是一种由OMG&#xff08;Object Management Group&#xff0c;对象管理组织&#xff09;制定的业务流程建模语言。以下是对BPMN标准的详细解释&#xff1a; 一、BPMN的起…...

【微服务】初识(day1)

基础概念 集群 集群是将一个系统完整的部署到多个服务器&#xff0c;每个服务器提供系统的所有服务&#xff0c;多个服务器可以通过负载均衡完成任务&#xff0c;每个服务器都可以称为集群的节点。 分布式 分布式是将一个系统拆分为多个子系统&#xff0c;多个子系统部署在…...

15分钟学 Python 第40天:Python 爬虫入门(六)第一篇

Day40 &#xff1a;Python 爬取豆瓣网前一百的电影信息 1. 项目背景 在这个项目中&#xff0c;我们将学习如何利用 Python 爬虫技术从豆瓣网抓取前一百部电影的信息。通过这一练习&#xff0c;您将掌握网页抓取的基本流程&#xff0c;包括发送请求、解析HTML、存储数据等核心…...

分层解耦-05.IOCDI-DI详解

一.依赖注入的注解 在我们的项目中&#xff0c;EmpService的实现类有两个&#xff0c;分别是EmpServiceA和EmpServiceB。这两个实现类都加上Service注解。我们运行程序&#xff0c;就会报错。 这是因为我们依赖注入的注解Autowired默认是按照类型来寻找bean对象的进行依赖注入…...

HCIP-HarmonyOS Application Developer 习题(六)

&#xff08;多选&#xff09;1、Harmonyos多窗口交互能力提供了以下哪几种交互方式? A. 平行视界 B.全局消息通知 C.分屏 D.悬浮窗 答案&#xff1a;ACD 分析&#xff1a;系统提供了悬浮窗、分屏、平行视界三种多窗口交互&#xff0c;为用户在大屏幕设备上的多任务并行、便捷…...

【电路基础 · 3】实际电压源 实际电流源;两种电源的等效情况;戴维南模型 诺顿模型(自用)

总览 1.实际电源的两种模型和它们的等效变换 2.两种电源的等效情况 3.戴维南模型 && 诺顿模型 一、实际电源的两种模型和它们的等效变换 1.实际电压源 实际电压源不允许短路。因为它的内阻太小&#xff0c;如果短路&#xff0c;电流很大&#xff0c;可能会烧毁电源…...

案例-猜数字游戏

文章目录 效果展示初始画面演示视频 代码区 效果展示 初始画面 演示视频 猜数字游戏 代码区 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width,…...

POI数据的处理与分析

POI概念 POI&#xff08;Point of Interest&#xff0c;兴趣点&#xff09;数据指的是地理空间数据中的一类&#xff0c;表示某一具体地点或位置的信息。通常&#xff0c;这些数据包含位置坐标&#xff08;经纬度&#xff09;、名称、地址、类别和其他相关信息。POI 数据广泛应…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​&#xff1a; 下载安装DevEco Studio 4.0&#xff08;支持HarmonyOS 5&#xff09;配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​&#xff1a; ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库&#xff08;如 Redisson&#xff09;相比于开发者自己基于 Redis 命令&#xff08;如 SETNX, EXPIRE, DEL&#xff09;手动实现分布式锁&#xff0c;提供了巨大的便利性和健壮性。主要体现在以下几个方面&#xff1a; 原子性保证 (Atomicity)&#xff…...