微信步数C++

news2024/10/6 13:21:02

题目:

 


样例解释:

【样例 #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.coloradmin.cn/o/2191988.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

llm接口高可用工程实践(尽快关注我,以后这些文章将只对粉丝开放)

上一节课程链接&#xff1a;中文llama3仿openai api实战-CSDN博客 &#xff0c;本文是在上一节基础上继续操作 课程介绍 本文基于Chinese-LLaMA-Alpaca-3&#xff08;https://github.com/ymcui/Chinese-LLaMA-Alpaca-3&#xff09;项目&#xff0c;介绍如何通过搭建2个llama3…

生信初学者教程(二十五):验证候选特征

文章目录 介绍加载R包导入数据函数重要特征的表达ROC分析汇总筛选结果输出结果总结介绍 在成功识别出核心特征之后,为了验证这些特征的有效性和可靠性,我们在发现数据集和验证数据集上进行了进一步的评估。这一步骤旨在确保这些特征在不同数据集上的表达值具有一致性,并验证…

大模型时代下小模型知多少?从模型结构、预训练数据到运行时成本分析总结

今天&#xff0c;我们来谈谈小模型。《Small Language Models综述&#xff0c;Small Language Models: Survey, Measurements, and Insights》&#xff1a;https://arxiv.org/pdf/2409.15790这个工作&#xff0c;会有一些启发。 本文主要介绍三个话题&#xff0c;一个是小模型…

【笔记】信度检验

一、信度 信度是指测量结果的一致性和稳定性。 1.一致性&#xff08;Consistency&#xff09; 一致性指的是测量工具内部各个部分或项目之间的协调一致程度。高一致性意味着测量工具的不同部分都在测量同一个概念或特质。 例子&#xff1a;智力测试 假设我们有一个包含100…

成为AI产品经理,应该具备哪些条件?

开篇勘误标题&#xff1a;未来不会有AI产品经理这个岗位&#xff0c;就像没有移动产品经理一样。 如果你是个产品经理&#xff0c;但是不懂移动端的产品交互和设计&#xff0c;那你就只能在自己的头衔前面加上一个“PC”&#xff1a;PC产品经理&#xff0c;代表你的细分或者不…

在线Html到Markdown转换器

具体请前往&#xff1a;在线Html转Markdown

6个最受欢迎的大模型本地运行工具

运行大型语言模型 (LLM)&#xff08;如 ChatGPT 和 Claude&#xff09;通常涉及将数据发送到 OpenAI 和其他 AI 模型提供商管理的服务器。虽然这些服务是安全的&#xff0c;但一些企业更愿意将数据完全离线&#xff0c;以保护更大的隐私。 本文介绍了开发人员可以用来在本地运…

Java 枚举一口气讲完!(´▽`ʃ♡ƪ)

Java 枚举类型 Java面向对象设计 - Java枚举类型 什么是枚举类型&#xff1f; 枚举类型创建常量的有序列表作为类型。它以特定顺序指定常量。 在枚举类型中定义的常量是该枚举类型的实例。 语法 使用关键字enum使用以下语法定义枚举类型&#xff1a; <access-modifie…

Vue基础指令用法

vue2&#xff0c;官网&#xff1a;介绍 — Vue.js (vuejs.org) 例子&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-s…

【SpringBoot】基础+JSR303数据校验

目录 一、Spring Boot概要 1. SpringBoot介绍 2. SpringBoot优点 3. SpringBoot缺点 4. 时代背景-微服务 二、Spring Boot 核心配置 1. Spring Boot配置文件分类 1.1 application.properties 1.2 application.yml 1.3 小结 2. YAML概述 3. YAML基础语法 3.1 注意事…

生信初学者教程(二十六):特征和免疫浸润的关联分析

文章目录 介绍加载R包导入数据函数重要特征与免疫细胞的相关热图SLC6A8关联图SLC6A8与特定免疫细胞SLC6A8与其他免疫细胞输出结果总结介绍 在成功获取核心特征集之后,我们计划深入地探究这些特征与免疫浸润细胞之间的关联性,这是因为免疫浸润细胞在癌症的进程中扮演着至关重要…

成都睿明智科技有限公司抖音电商新蓝海的领航者

在当今这个数字化浪潮汹涌的时代&#xff0c;电商行业正以惊人的速度迭代升级&#xff0c;而抖音电商作为新兴势力&#xff0c;更是凭借其庞大的用户基数、精准的算法推荐和高度互动的社区氛围&#xff0c;成为了众多商家竞相追逐的蓝海市场。在这片充满机遇与挑战的海洋中&…

关于Excel将列号由字母改为数字

将Excel的列表由字母改为数字 步骤&#xff1a; 文件-选项-公式-勾选“使用公式”中的“R1C1引用样式(R)”-确定即可 部分步骤图示 设置前的样子 设置后的样子 虽然现在还不清楚在xlwings操作Excel时有什么作用&#xff0c;先留着吧。

内网靶场 | 渗透攻击红队内网域渗透靶场-1(Metasploit)零基础入门到精通,收藏这一篇就够了

“ 和昨天的文章同一套靶场&#xff0c;这次主要使用的是Kali Linux以及Metasploit来打靶场&#xff0c;熟悉一下MSF在内网渗透中的使用&#xff0c;仅供学习参考&#xff0c;大佬勿喷。本期文章靶场来自公众号&#xff1a;渗透攻击红队。” 靶场下载地址&#xff1a;https://…

SpringBoot框架在在线教育系统中的应用

3系统分析 3.1可行性分析 通过对本微服务在线教育系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本微服务在线教育系统采用SSM框架&#xff0c;JAVA作为开…

微调大语言模型——超详细步骤

微调一个语言模型&#xff0c;其实就是在一个已经训练过的模型上&#xff0c;继续用新数据进行训练&#xff0c;帮助模型更好地理解和处理这个新的任务。可以把这个过程想象成教一个已经懂很多道理的人去解决新的问题。 这个过程可以分为五个简单的步骤&#xff1a; 加载预训练…

【目标检测】桥梁表面缺陷检测数据集6710张7类缺陷VOC+YOLO格式

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;6718 标注数量(xml文件个数)&#xff1a;6718 标注数量(txt文件个数)&#xff1a;6718 标注…

车载测试分享:CANoe工具使用、真实项目实操、UDS诊断测试、ECU刷写测试、物理层测试、数据链路层测试、应用层测试、HIL测试等

FOTA模块中OTA的知识点&#xff1a;1.测试过程中发现哪几类问题&#xff1f; 可能就是一个单键的ecu&#xff0c;比如升了一个门的ecu&#xff0c;他的升了之后就关不上&#xff0c;还有就是升级组合ecu的时候&#xff0c;c屏上不显示进度条。 2.在做ota测试的过程中&#xff…

知识链=知识图谱+大模型+推理-幻觉

最近由华东师大和香港大学联合提出了一种面向大语言模型推理的幻觉缓解方法Chain-of-Knowledge被ACL2024接收为长文主会。 PDF: https://arxiv.org/pdf/2306.06427 最近这两年&#xff0c;诸如GPT-4、LLaMA3等一系列超百亿规模的大语言模型相继提出&#xff0c;这些大模型以其…

AI少女/HS2甜心选择2 仿逆水寒人物卡全合集打包

内含AI少女/甜心选择2 仿逆水寒角色卡全合集打包共6张 内含&#xff1a;白灵雪魅落霞飞雁君临华歌白君临华歌黑平野星罗晚香幽韵 下载地址&#xff1a; https://www.51888w.com/436.html 部分演示图&#xff1a;