微信步数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;
}

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

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

相关文章

AI 激活新势能,中小企业全媒体营销绽放无限可能

什么是全媒体营销&#xff1a; 全媒体营销是一种利用多种媒介渠道进行品牌、产品或服务推广的营销策略。它结合了传统媒体&#xff08;如电视、广播、报纸、杂志&#xff09;和新媒体&#xff08;如互联网、社交媒体、移动应用等&#xff09;的优势&#xff0c;以实现信息的广…

力扣之1322.广告效果

题目&#xff1a; sql建表语句&#xff1a; Create table If Not Exists Ads (ad_id int,user_id int,action ENUM (Clicked, Viewed, Ignored) ); Truncate table Ads; insert into Ads (ad_id, user_id, action) values (1, 1, Clicked); insert into Ads (ad_id, use…

【重学 MySQL】五十八、文本字符串(包括 enum set)类型

【重学 MySQL】五十八、文本字符串&#xff08;包括 enum set&#xff09;类型 CHAR 和 VARCHARTEXT 系列ENUMSET示例注意事项 在 MySQL 中&#xff0c;文本字符串类型用于存储字符数据。这些类型包括 CHAR、VARCHAR、TEXT 系列&#xff08;如 TINYTEXT、TEXT、MEDIUMTEXT 和 L…

基于SSM的仿win10界面的酒店管理系统

基于SSM的仿win10界面的酒店管理系统 运行环境: jdk1.8 eclipse tomcat7 mysql5.7 项目技术: jspssm&#xff08;springspringmvcmybatis&#xff09;mysql 项目功能模块&#xff1a;基础功能、房间类型、楼层信息、附属功能

AtCoder ABC373 A-D题解

ABC372 的题解没写是因为 D 是单调栈我不会(⊙︿⊙) 比赛链接:ABC373 总结&#xff1a;wssb。听说 E 很水&#xff1f;有时间我看看。 Problem A: Code #include <bits/stdc.h> using namespace std; int mian(){int ans0;for(int i1;i<12;i){string S;cin>&g…

[Offsec Lab] ICMP Monitorr-RCE+hping3权限提升

信息收集 IP AddressOpening Ports192.168.52.218TCP:22,80 $ nmap -p- 192.168.52.218 --min-rate 1000 -sC -sV -Pn PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.9p1 Debian 10deb10u2 (protocol 2.0) | ssh-hostkey: | 2048 de:b5:23:89:bb:9f:d4:1…

表面缺陷检测系统源码分享

表面缺陷检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vision …

Redis篇(缓存机制 - 基本介绍)(持续更新迭代)

目录 一、缓存介绍 二、经典三缓存问题 1. 缓存穿透 1.1. 简介 1.2. 解决方案 1.3. 总结 2. 缓存雪崩 2.1. 简介 2.2. 解决方案 2.3. 总结 3. 缓存击穿 3.1. 简介 3.2. 解决方案 3.3. 总结 4. 经典三缓存问题出现的根本原因 三、常见双缓存方案 1. 缓存预热 1…

国外媒体宣发:怎么在海外电子杂志版上发布新闻稿-时代周刊Time发布新闻稿

时代周刊Time发布新闻稿 在全球化的浪潮中&#xff0c;新闻媒体扮演着传递信息、引导舆论、塑造公众认知的重要角色。作为国际知名的媒体品牌&#xff0c;时代周刊&#xff08;Time&#xff09;以其独特的视角和深入的报道&#xff0c;为全球读者提供了一扇观察世界的窗口。近…

深度学习:GAN图像生成

GAN的诞生背景 诞生&#xff1a; 2014年由Ian Goodfellow提出 创新性&#xff1a; 无监督学习&#xff1a;GAN 提供了一种新的方法来进行无监督学习&#xff0c;即不需要对训练数据进行标注就可以学习到数据的潜在分布。对抗训练&#xff1a;通过引入对抗机制&#xff0c;G…

C语言文件操作(下)(28)

文章目录 前言一、文件的打开和关闭打开打开模式相对路径和绝对路径 关闭 二、文件操作正确流程三、文件顺序读写函数fopenfclosefputcfgetcfputsfgetsfprintffscanfsprintfsscanffwritefread 四、文件随机读写函数fseekftellrewind 五、文件读取结束时候的判断feofferror具体例…

Mysql锁机制解读(敲详细)

目录 锁的概念 全局锁 表级锁 表锁 元数据锁 意向锁 锁的概念 全局锁 表级锁 表锁 元数据锁 主要是对未提交事务&#xff0c;修改表结构造成表结构混乱&#xff0c;进行控制。 在不涉及表结构变化的情况下,元素锁可以忽略。 意向锁 避免有行级锁影响加表级锁&#xff0…

openpnp - 吸嘴校正失败的opencv参数分析

文章目录 openpnp - 吸嘴校正失败的opencv参数分析概述笔记阶段验证 - N2吸嘴校验完NT1NT2 阶段验证 - 底部相机高级校验完NT1NT2 参数比对保存 “阶段验证 - N2吸嘴校验完” 的NT1/NT2图像重建参数检测环境NT1ok的3个参数值NT1err的3个参数值NT2ok的3个参数值NT2err的3个参数值…

黑马JavaWeb开发跟学(九)MyBatis基础操作

黑马JavaWeb开发跟学九.MyBatis基础操作 1. Mybatis基础操作1.1 需求1.2 准备1.3 删除1.3.1 功能实现1.3.2 日志输入1.3.3 预编译SQL1.3.3.1 介绍1.3.3.2 SQL注入1.3.3.3 参数占位符 1.4 新增1.4.1 基本新增1.4.2 主键返回 1.5 更新1.6 查询1.6.1 根据ID查询1.6.2 数据封装1.6.…

C++引用(变量引用、数组引用与数组指针、引用本质-指针常量、常量引用)

C语言 ——对数组名进行解引用,取地址,还有sizeof和strlen进行操作解析_对数组名解引用得到什么-CSDN博客 C++引用(变量引用、数组引用与数组指针、引用本质-指针常量、常量引用)_c++11 数组引用-CSDN博客

复现文章:R语言复现文章画图

文章目录 介绍数据和代码图1图2图6附图2附图3附图4附图5附图6 介绍 文章提供画图代码和数据&#xff0c;本文记录 数据和代码 数据可从以下链接下载&#xff08;画图所需要的所有数据&#xff09;&#xff1a; 百度云盘链接: https://pan.baidu.com/s/1peU1f8_TG2kUKXftkpYq…

软考系统分析师知识点四:操作系统基本原理

前言 今年报考了11月份的软考高级&#xff1a;系统分析师。 考试时间为&#xff1a;11月9日。 倒计时&#xff1a;33天。 目标&#xff1a;优先应试&#xff0c;其次学习&#xff0c;再次实践。 复习计划第一阶段&#xff1a;扫平基础知识点&#xff0c;仅抽取有用信息&am…

LabVIEW技术难度最大的程序

在LabVIEW开发中&#xff0c;技术难度最大的程序通常涉及复杂的系统架构、高精度的控制要求、大量数据处理&#xff0c;以及跨平台或多硬件设备的集成。以下是几类具有高技术难度的LabVIEW程序&#xff1a; 1. 高精度实时控制系统 LabVIEW中涉及高精度实时控制的系统程序&…

十四、深入理解Mysql索引底层数据结构与算法

文章目录 一、索引的本质1、索引是帮助MySQL高效获取数据的排好序的数据结构2、索引的数据结构3、数据结构可视化网站 二、常见数据结构介绍1、B-Tree2、BTree&#xff08;B-Tree变种&#xff09;3、Hash结构 三、存储引擎的索引实现1、MyISAM存储引擎索引实现MyISAM索引文件和…

Linux搭建Hadoop集群(详细步骤)

前言 Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下&#xff0c;开发分布式程序。充分利用集群的威力进行高速运算和存储。 说白了就是实现一个任务可以在多个电脑上计算的过程。 一&#xff1a;准备工具 1.1 VMware 1.2L…