P4774 [NOI2018] 屠龙勇士

P4774 [NOI2018]屠龙勇士(exCRT) P4774 [NOI2018]屠龙勇士(exCRT) 题目链接:传送门 思路: ​ 首先根据题意我们可以算出来对于每一条龙使用的武器攻击力(这个使用set和upper_bound成员函数很容易实现)。 ​ 现在我们价假设第 i​i​i​ 条龙的生命值为h[i]​h[i]​h[i]​,恢复能力为p[i]​p[i]​p[i]​,此时使用的武器攻击力为g[i]​g[i]​g[i]​, 那么我们攻击次数x... 阅读详情

Label

EXCRT的简单变式(解标准线性同余方程组)+multiset实现普通平衡树功能

Description

https://www.luogu.com.cn/problem/P4774

Solution

首先,由于小D按1∼n1\sim n1∼n顺序屠龙,故我们用一个multiset动态维护SSS(SSS:剑的攻击力),根据题意,面对第iii条巨龙时,我们查询可重集内aia_iai​的前驱并作为SiS_iSi​(屠第iii条龙所用剑的攻击力),若aia_iai​无前驱则令Si=aiS_i=a_iSi​=ai​的后继。

当我们求出所有SiS_iSi​后,将题意转化为数学语言即为:求最小的x≥maxi=1n⌈aisi⌉x\ge max_{i=1}^{n}\lceil\frac{a_i}{s_i}\rceilx≥maxi=1n​⌈si​ai​​⌉,使如下标准线性同余方程组成立:
​ {s1x≡a1(modp1)s2x≡a2(modp2)......snx≡an(modpn)\begin{cases}s_1x\equiv a_1(modp_1)\\s_2x\equiv a_2(modp_2)\\......\\s_nx\equiv a_n(modp_n)\end{cases}⎩⎪⎪⎪⎨⎪⎪⎪⎧​s1​x≡a1​(modp1​)s2​x≡a2​(modp2​)......sn​x≡an​(modpn​)​

(特判:由于我们必须把每一条龙的血量变成非正数后龙才会回血,故有上面xxx的取值范围)

虽然相比于EXCRTEXCRTEXCRT的标准形式,每一个线性同余方程前多了一个系数sis_isi​,但类比EXCRTEXCRTEXCRT的推导过程,我们仍不难得出解该方程组的一般方法:

设前i−1i-1i−1个方程的通解为x0+tPi−1x_0+tP_{i-1}x0​+tPi−1​(P=lcm(p1gcd(p1,s1),p2gcd(p2,s2)...pi−1gcd(pi−1,si−1)))(P=lcm(\frac{p_1}{gcd(p_1,s_1)},\frac{p_2}{gcd(p2,s_2)}...\frac{p_{i-1}}{gcd(p_{i-1},s_{i-1})}))(P=lcm(gcd(p1​,s1​)p1​​,gcd(p2,s2​)p2​​...gcd(pi−1​,si−1​)pi−1​​))(此处注意:根据EXCRTEXCRTEXCRT内通解的推导及gcd(si,pi)∣sigcd(s_i,p_i)|s_igcd(si​,pi​)∣si​,我们可得pi∣sipigcd(si,pi)p_i|\frac{s_ip_i}{gcd(s_i,p_i)}pi​∣gcd(si​,pi​)si​pi​​,故此处通解形式与EXCRTEXCRTEXCRT不同)则:对于第iii个同余方程six≡ai(modpi)s_ix\equiv a_i(modp_i)si​x≡ai​(modpi​),∃t[si(x0+tPi−1)≡ai(modpi)]\exist t[s_i(x_0+tP_{i-1})\equiv a_i(modp_i)]∃t[si​(x0​+tPi−1​)≡ai​(modpi​)]即说明前iii个同余方程组有解,反之则无解。

将si(x0+tP)≡ai(modpi)s_i(x_0+tP)\equiv a_i(modp_i)si​(x0​+tP)≡ai​(modpi​)化成二元一次不定方程的形式:

six0+sitPi−1≡ai(modpi)s_ix_0+s_itP_{i-1}\equiv a_i(modp_i)si​x0​+si​tPi−1​≡ai​(modpi​)

​siPi−1t+six0=piu+ais_iP_{i-1}t+s_ix_0= p_iu+a_isi​Pi−1​t+si​x0​=pi​u+ai​

​siPi−1t+piu=ai−six0s_iP_{i-1}t+p_iu=a_i-s_ix_0si​Pi−1​t+pi​u=ai​−si​x0​

据Bézout定理,若gcd(siPi−1,pi)∤ai−six0gcd(s_iP_{i-1},p_i)\nmid a_i-s_ix_0gcd(si​Pi−1​,pi​)∤ai​−si​x0​,则原方程组无解,反之即用EXCGD解出上述方程的一组特解t0,u0t_0,u_0t0​,u0​,ttt的通解即可表示为t=t0+kpigcd(siPi−1,pi)t=t_0+k\frac{p_i}{gcd(s_iP_{i-1},p_i)}t=t0​+kgcd(si​Pi−1​,pi​)pi​​。

求出ttt后,前iii个方程组的解ansi=x0+tPi−1+kPians_i=x_0+tP_{i-1}+kP_iansi​=x0​+tPi−1​+kPi​。将此过程归纳即为求方程组解的一般过程。

最后,注意面对第111条龙时诸变量的取值。

总结:1、注重每一步推导过程的准确性;

​ 2、注意特判情况; 3、留意炸精度的地方并适当使用慢速乘。

Code

毕竟此题是近几年NOI的D2T1,故需要注意的细节不在少,详见如下代码。

#include<cstdio>
#include<iostream>
#include<set>
#define ll long long
using namespace std;

const int MAXN=2e5;
int T,N,M;
ll ai[MAXN],pi[MAXN],fsts[MAXN],gives,si[MAXN];
ll atktot,maxatk,atkstep,A,B,C,ans,P,Pi,G,x,y,xi,yi;
multiset<ll>S;

ll Max(ll a,ll b) { return ((a>b)?(a):b); }
ll Gcd(ll a,ll b) { return ((b==0)?a:Gcd(b,a%b)); }
ll Lcm(ll a,ll b) { return (a/Gcd(a,b))*b; }
ll Msc(ll a,ll b,ll MOD)
{
	ll tot=0;
	for(;b;b>>=1,a=(a+a)%MOD)
		if(b&1)	tot=(tot+a)%MOD;
	return tot;
}

void Exgcd(ll a,ll b)
{
	if(b==0) { x=1,y=0; return; }
	Exgcd(b,a%b);
	xi=x,yi=y;
	x=yi,y=xi-(a/b)*yi;
}

ll Excrt()
{
	ans=0LL; P=1LL; maxatk=0LL;
	for(int i=1;i<=N;++i)
	{
		atktot=ai[i]/si[i];
		if(ai[i]%si[i]>0)	++atktot;
		maxatk=Max(maxatk,atktot);//此三句:判断至少需攻击maxatk次(因为最后线性同余方程的解有可能小于maxatk,不合法) 
		A=si[i]*P,B=pi[i],C=ai[i]-si[i]*ans;
		G=Gcd(A,B);
		if(G<0)	G=-G;//便于使用第一次慢速乘 
		if(C%G!=0)	return -1;
		Exgcd(A,B);
		x=(x%(B/G)+(B/G))%(B/G);//将x变为正数便于Msc 
		x=(Msc(C/G,x,(B/G))+(B/G))%(B/G);//注意:ax+by=c通解形式下步长与ax+by=g一致!(此处会爆longlong,需龟速乘) 
		if(x==0)	x=B/G;//x不能为0 
		Pi=Lcm(P,B/Gcd(B,si[i]));//注意:通解不再是X0+kLcm(p1,p2...pn) 
		if(i==1)	ans=x;
		else	ans=(ans+Msc(P,x,Pi))%Pi;
		P=Pi;
		ans=(ans%P+P)%P;
		if(ans==0)	ans=P;//ansx不能为0且不能小于将每条龙砍成负血的最小刀数
	}
	if(ans<maxatk)//特判 
	{
		atkstep=(maxatk-ans)/P;
		ans+=atkstep*P;
		if((maxatk-ans)%P>0)	ans+=P;
	}
	return ans;
}

void work()
{
	S.clear();
	scanf("%d%d",&N,&M);
	for(int i=1;i<=N;++i)	scanf("%lld",&ai[i]);
	for(int i=1;i<=N;++i)	scanf("%lld",&pi[i]);
	for(int i=1;i<=N;++i)	scanf("%lld",&fsts[i]);
	for(int i=1;i<=M;++i)
	{
		scanf("%lld",&gives);
		S.insert(gives);
	}
	for(int i=1;i<=N;++i)
	{
		if(S.upper_bound(ai[i])!=S.begin())	si[i]=*--S.upper_bound(ai[i]);
		else	si[i]=*S.upper_bound(ai[i]);
		S.erase(S.find(si[i]));
		S.insert(fsts[i]);
	}
	cout<<Excrt()<<'\n';
}

int main()
{
	scanf("%d",&T);
	for(int i=1;i<=T;++i)	work();
	return 0;
}
PAM4信号测试实战:从眼图分析到误码率测量的技术演进 在高速数字系统设计中,信号完整性测试是确保数据传输可靠性的核心环节。其基本原理在于通过时域和频域分析,精确评估信号在传输过程中的质量衰减与失真。随着数据速率向56Gbps及以上演进,传统的NRZ编码面临带宽瓶颈,而PAM4调制技术通过在每个符号周期内承载更多比特信息,成为提升信道效率的关键路径。这项技术的工程价值在于,它允许在相同带宽下实现翻倍的数据吞吐量,这对于数据中心互联、PCIe 6.0及800G以太网等高速接口至关重要。然而,PAM4信号电平间距更小,对噪声和抖动极为敏感,导致其原始误码率显著升高, 阅读详情

相关推荐

浅谈python反序列化漏洞

0x01 python序列化与反序列化 Python 的序列化和反序列化是将一个类对象向字节流转化从而进行存储和传输,然后使用的时候再将字节流转化回原始的对象的一个过程。python中的序列化操作是通过pickle模块,而该模块主要包含l dumps将dict转化为str格式,loads将str格式转化为dict格式。 dump和load与文件操作结合起来, pickle.dump(obj, f...

Lethe's Blog 3220

【题解】Luogu-P4774 [NOI2018] 屠龙勇士

与恶龙缠斗过久,自身亦成为恶龙。凝视深渊过久,深渊将回以凝视。 ​ ——尼采《善恶的彼岸》 P4774 [NOI2018] 屠龙勇士 Description\text{Description}Description 玩家需要按照编号 1→n1 \to n1→n 顺序杀掉 nnn 条巨龙,每条巨龙拥有一个初始的生命值 bib_ibi​。同时每条巨龙拥有恢复能力,会使它的生命值每次增加 aia_iai​,直至生命值非负。 游戏开始时玩家拥有 mmm 把剑,每.

mango09の世界 353

AUTOSAR E2E Protocol实战:Profile1到Profile5的配置差异与最佳实践

本文深入解析AUTOSAR E2E Protocol中Profile1到Profile5的核心配置差异与适用场景。针对经典CAN、CAN FD及以太网等不同总线,详细对比了计数器、CRC、DataID等关键参数,并结合实战代码与配置示例,为工程师根据功能安全等级、数据长度与带宽限制选择最佳Profile提供了清晰的选型路径与工程实践指南。

milk5的博客 940

P4774 [NOI2018]屠龙勇士

昨天晚上快走时看了这题:不是exgcd+excrt吗? 旁边张大佬默默看了我一眼(觉得我会死) 然后于是我今天中午才调出来Orz 思路:exgcd+excrt 提交:5次 错因:龟速乘传进去了负数,并且用的int;之前写过的excrt的板子有问题 题解: 先要特判一种情况:若 \(p[i]=1\) ,答案显然就是 \(\max(\lceil\frac{a[i]}{stk[i]}\rce...

176

STM32 SAI接口TDM模式实战:8通道音频采集系统搭建全流程(附DMA配置代码)

本文详细介绍了基于STM32 SAI接口TDM模式搭建8通道音频采集系统的全流程。内容涵盖硬件连接设计、CubeMX时钟树与SAI外设的详细配置,并重点解析了TDM模式的核心代码实现与DMA双缓冲机制,提供了完整的配置代码和常见时序问题排查指南,助力开发者高效实现多通道音频传输与处理。

weixin_29192211的博客 505

手把手教你为FPGA项目集成HyperRAM IP核:从AXI接口封装到上板调试全流程

本文详细介绍了如何为FPGA项目集成HyperRAM IP核,涵盖从AXI接口封装到上板调试的全流程。通过对比DDR3L、PSRAM和HyperRAM的性能指标,突出HyperRAM在低功耗和小封装尺寸方面的优势,并提供硬件连接、AXI4-Lite接口设计、状态机优化及调试技巧等实用内容,帮助开发者高效完成FPGA项目中的内存扩展。

weixin_32103009的博客 284

P4774-[NOI2018]屠龙勇士【EXCRT】

正题 题目链接:https://www.luogu.com.cn/problem/P4774 题目大意 nnn个龙血量为aia_iai​,回复能力为pip_ipi​,死亡后掉落剑的攻击力tit_iti​,mmm把剑,攻击力为bib_ibi​。 从111开始打,每次使用不大于当前龙血量的剑中攻击力最低的一把(没有就用攻击力最低的),造成x×atkx\times atkx×atk点伤害,然后当前的剑坏掉。 求一个最小的xxx使得所有龙被攻击后血量是pip_ipi​的倍数。 1≤n,m≤1051\leq n,m

QuantAsk 373

Vivado FFT IP核配置与实战:FPGA信号处理硬件加速指南

快速傅里叶变换(FFT)是数字信号处理(DSP)中的核心算法,用于将时域信号转换到频域进行分析。其原理基于离散傅里叶变换(DFT),通过蝶形运算的分解与复用,大幅降低了计算复杂度。在工程实践中,软件实现的FFT难以满足高速实时处理的需求,因此硬件加速方案至关重要。FPGA凭借其并行架构和可定制性,成为实现高性能FFT的理想平台。通过集成专用的FFT IP核,如Vivado中的Pipelined Streaming I/O架构,可以构建流水线化的计算引擎,实现极低延迟和高吞吐量的连续数据流处理。这种硬件方案特

weixin_42536863的博客 646

[洛谷P4774] [NOI2018]屠龙勇士

洛谷题目链接:[NOI2018]屠龙勇士 因为markdown复制过来有点炸格式,所以看题目请戳上面. 题解: 因为杀死一条龙的条件是在攻击\(x\)次,龙恢复\(y\)次血量\((y\in N^{*})\)后龙的血量恰好为\(0\).那么根据题意我们可以列出方程: \[atk_i*x\equiv hp_i(mod \ p_i)\] 这个形式是不是很像中国剩余定理的形式:\(x\equ...

dengtun2502的博客 186

SVG文件上传漏洞实战:从XSS攻击到防御策略

本文深入剖析了SVG文件上传漏洞的成因与危害,揭示了攻击者如何利用SVG的XML本质构造恶意文件,绕过常规检查实现存储型XSS攻击。文章通过实战复现演示了完整的攻击链,并提供了从严格内容检查、安全解析过滤到设置CSP策略等多层次的纵深防御方案,帮助开发者从根本上加固文件上传功能。

weixin_29230805的博客 395

vue3+ts+elementui-plus二次封装树形表格实现不同层级展开收起的功能

我只定义了三层数据,就只演示展开了三层,还可以多层,自己设置即可。

蜗牛~~ 2602

P4774 [NOI2018]屠龙勇士(exCRT,multiset)

P4774 [NOI2018]屠龙勇士 本题做题思路参考 @shadowice1984的题解 简要题意 有nnn条巨龙和mmm把剑,每条巨龙有aia_iai​的初始生命值,有pip_ipi​的恢复能力. 一条巨龙被杀死当且仅当其受到的伤害使其剩余血量恰好为000或者在任意次恢复后恰好为000. 而每次拿来杀巨龙的剑也有要求: 1.1 .1. 优先选择当前拥有的,攻击力不高于巨龙初始生命值中攻击力最...

仙都一普通市民的blog 275

RK3568平台开发系列:Android环境下CAN的使用

在RK3568平台上,我们可以利用Android环境中的API来实现CAN的使用。通过以上步骤,我们可以在Android应用中发送和接收CAN数据,并进行相应的处理。当接收到CAN数据时,将触发onMessageReceived回调方法,我们可以在这个方法中对接收到的数据进行处理。在上述代码中,我们指定了CAN的ID为0x123,数据为{0x01, 0x02, 0x03},并设置了标志位和周期。接收CAN数据需要注册一个监听器,并在监听器中处理接收到的数据。发送CAN数据需要指定CAN的ID和数据。

2301_79330513的博客 1912

luogu P4774 [NOI2018]屠龙勇士

传送门 这题真的是送温暖啊qwq,而且最重要的是yyb巨佬在Day2前几天正好学了crt,还写了博客 然而我都没仔细看,结果我就同步赛打铁了QAQ 我们可以先根据题意,使用set维护,求出每次的攻击力 然后对于一条龙,要使得砍到生命值能加到0,那么 攻击力\(a_i\) * 次数\(x\) 要和 血量\(b_i\) 在膜 回复量\(p_i\) 意义下同余,也就是\(a_ix\equiv b_i\m...

weixin_30433075的博客 133

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

NOI2018/LuoGu P4774屠龙勇士

本蒟蒻终于屠龙成功!! 作为一个我的世界的资深玩家,对屠龙有着无比的信仰和热情!! 首先吐槽一下这只信息龙,它变成负HP后居然不会死,只有他自己回血回到了0HP才算死23333 来我们来看看题意描述,国赛的题意描述略长 这道题其实没有那么的可怕,当时我写完excrt就有学长推荐我来写 题目描述 小 D 最近在网上发现了一款小游戏。游戏的规则如下: • 游戏的目标是按照编号...

bangzuan5029的博客 163

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【洛谷P4774】[NOI2018] 屠龙勇士【Excrt Exgcd】

linklinklink 分析: ExcrtExcrtExcrt 用multisetmultisetmultiset 就可以快速求出要用的剑了 除非你想写平衡树 问题转化成:::求同余方程组 {Atk1x≡Hp1 (mod p1)Atk2x≡Hp2 (mod p2)  ...Atknx≡Hpn (mod pn) \begin{cases} Atk_1x≡Hp_1~(mod~p_1)\\ Atk_2x≡Hp_2~(mod~p_..

绫 236

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

洛谷P4774 [NOI2018]屠龙勇士

传送门 题解 这题到底是什么东西……数学题太珂怕了…… 1 //minamoto 2 #include<iostream> 3 #include<cstdio> 4 #include<algorithm> 5 #include<set> 6 #define ll long long 7 #define GG ...

weixin_33769207的博客 109

洛谷P4774 [NOI2018]屠龙勇士 [扩欧,中国剩余定理]

传送门 思路 首先可以发现打每条龙的攻击值显然是可以提前算出来的,拿multiset模拟一下即可。 一般情况 可以搞出这么一些式子: \[ atk_i\times x=a_i(\text{mod}\ p_i) \] 简单处理一下就变成这样: \[ atk_i\times x +p_i \times y=a_i \] 显然可以扩欧搞出一组特解\((x',y')\),那么就有 \[ x=x...

dfn8726的博客 150
上一篇: CF1500B(Div.1) Two chandeliers
下一篇: P3306 [SDOI2013] 随机数生成器
guapi2333
博客等级 码龄9年 7粉丝 73原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值