NOI 2018 屠龙勇士(exCRT)

【题解&总结】 「NOI2018」屠龙勇士 题目大意 题解 考虑把题目转换一下,假设我们把杀每条龙所要用的剑求出来了(用平衡树或线段树预处理一下),设当前的剑的攻击力为 AiA_iAi​ 那么题目就可以转换为: 找到一个最小的 xxx ,使得对于 ∀i∈[1,n]\forall i\in[1,n]∀i∈[1,n] ,都有 Ai⋅x≡ai (mod pi)A_i\cdot x\equiv a_i\ (mod\ p_i)Ai​⋅x≡ai​ (mod pi​) 发现这与excrt很像,我们考虑化成其一般形式。 但我 阅读详情

NOI 2018 屠龙勇士(exCRT)

题目链接

根据题目。对于每一条龙,设其血量为a,回血量为p。选择武器的攻击力为ATK,攻击的最少次数为x。可以得到同余方程:
A T K ⋅ x ≡ a ( m o d p ) ATK\cdot x\equiv a\pmod p ATK⋅x≡a(modp)
这个方程也等价于
A T K g c d ( A T K , p ) ⋅ x ≡ a g c d ( A T K , p ) ( m o d p g c d ( A T K , p ) ) \frac{ATK}{gcd(ATK,p)}\cdot x\equiv \frac{a}{gcd(ATK,p)}\pmod {\frac{p}{gcd(ATK,p)}} gcd(ATK,p)ATK​⋅x≡gcd(ATK,p)a​(modgcd(ATK,p)p​)
把上面的同余方程转换为下面的好处是,由于模数的变小,让中间数据更不易溢出。

证明: a ⋅ x ≡ b ( m o d p ) a\cdot x\equiv b \pmod p a⋅x≡b(modp)等价于 a d ⋅ x ≡ b d ( m o d p d ) \frac{a}{d}\cdot x\equiv \frac{b}{d}\pmod {\frac{p}{d}} da​⋅x≡db​(moddp​),其中 d = g c d ( a , p ) d=gcd(a,p) d=gcd(a,p)。
根据扩展欧几里得算法的证明可知,方程 a ⋅ x ≡ b ( m o d p ) a\cdot x\equiv b \pmod p a⋅x≡b(modp)有解当且仅当 g c d ( a , p ) ∣ b gcd(a,p)|b gcd(a,p)∣b。
若方程 a ⋅ x ≡ b ( m o d p ) a\cdot x\equiv b \pmod p a⋅x≡b(modp)无解,则显然另一个方程也是无解的。
假设方程有解,令 d = g c d ( a , p ) d=gcd(a,p) d=gcd(a,p),有
a ⋅ x ≡ b ( m o d p ) ⟺ a ⋅ x − b = y ⋅ p ⟺ a d ⋅ x − b d = y ⋅ p d ⟺ a d ⋅ x ≡ b d ( m o d p d ) \begin{aligned} a\cdot x\equiv b \pmod p &\Longleftrightarrow a\cdot x-b=y\cdot p\\ &\Longleftrightarrow \frac{a}{d}\cdot x-\frac{b}{d}=y\cdot \frac{p}{d}\\ &\Longleftrightarrow \frac{a}{d}\cdot x\equiv \frac{b}{d} \pmod {\frac{p}{d}} \end{aligned} a⋅x≡b(modp)​⟺a⋅x−b=y⋅p⟺da​⋅x−db​=y⋅dp​⟺da​⋅x≡db​(moddp​)​
如此一来,整个题目就转换为一个含有n个同余方程的方程组。
{ a n s ≡ x 1 ( m o d p 1 ) a n s ≡ x 2 ( m o d p 2 ) . . . a n s ≡ x n ( m o d p n ) \left\{\begin{matrix} ans\equiv x_1 \pmod {p_1}\\ ans\equiv x_2 \pmod {p_2}\\ .\\ .\\ .\\ ans\equiv x_n \pmod {p_n} \end{matrix}\right. ⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧​ans≡x1​(modp1​)ans≡x2​(modp2​)...ans≡xn​(modpn​)​
通过扩展中国剩余定理就可以轻松求解啦。
需要注意的是,题目有个限制条件:对于每一条龙 a − A T K ⋅ x < 0 a-ATK\cdot x<0 a−ATK⋅x<0
所以需要找出所有龙的x的最大值Max。在求得线性同余方程组的解X后,需要满足X>=Max。

因为同余方程的解是一个同余类,其符合解的同余类的代表元为X,我们只需要让 a n s = X + ⌈ M a x − X p ⌉ ⋅ P ans=X+\lceil\frac{Max-X}{p}\rceil\cdot P ans=X+⌈pMax−X​⌉⋅P即可。

至于在选择哪把剑🗡的问题,可以考虑用multiset(多重集合)来实现。multiset自带upper_bound函数,支持插入insert,删除erase。

由于中间数据会爆long long,在解同余方程时,选择用慢速乘来替代乘法。

代码如下:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m;
const int max_n=1e5+5;
ll a[max_n];
ll p[max_n];
ll reward[max_n];
ll atk[max_n];
ll Max;
multiset<ll> ms;
void exgcd(ll a,ll b,ll &d,ll &x,ll &y)
{
	if(!b){
		d=a;x=1;y=0;return ;
	}
	else{
		exgcd(b,a%b,d,y,x);y-=(a/b)*x;return ;
	}
}
ll mul(ll a,ll b,ll mod)
{
	a%=mod;
	ll ans=0;
	while(b)
	{
		if(b&1)ans=(ans+a)%mod;
		a=(a+a)%mod;
		b>>=1;
	}
	return (ans%mod+mod)%mod;
}
ll equation(ll a,ll b,ll &p)//a*x=b (mod p)
{
	a%=p;b%=p;
	ll x,y,d;
	exgcd(a,p,d,x,y);
	if(b%d)return -1;
	x=mul(x,b/d,p/d);
	p/=d;
	return x;
 } 
ll solve(void)
{
	ll X=0,P=1;
	for(int i=1;i<=n;i++)
	{
		ll t0=a[i]/atk[i]+(a[i]%atk[i]?1:0);//a[i]-x*atk[i]<0
		if(t0>Max)Max=t0;
		ll b=equation(atk[i],a[i],p[i]);//每个同余方程得解 
		if(b==-1)return -1;
		ll x,y,d;
		ll t=((b-X)%p[i]+p[i])%p[i];//EXCRT
		exgcd(P,p[i],d,x,y);
		if(t%d)return -1;
		x=mul(x,t/d,p[i]/d);
		X+=x*P;
		P*=p[i]/d; 
	}
	if(X>=Max)return X;
	else return X+((Max-X)/P+((Max-X)%P?1:0))*P;
}
int main(void)
{
//	freopen("in.txt","r",stdin);
//	freopen("out.txt","w",stdout);
	int t;
	ll t2;
	scanf("%d",&t);
	while(t--)
	{
		max=-1;
		ms.clear();
		scanf("%d%d",&n,&m);
		for(int i=1;i<=n;i++)
		scanf("%lld",&a[i]);
		for(int i=1;i<=n;i++)
		scanf("%lld",&p[i]);
		for(int i=1;i<=n;i++)
		scanf("%lld",&reward[i]);
		for(int i=1;i<=m;i++)
		{
			scanf("%lld",&t2);
			ms.insert(t2);
		}
		multiset<ll>::iterator it;
		for(int i=1;i<=n;i++)
		{
			it=ms.upper_bound(a[i]);
			if(it!=ms.begin())it--;
			atk[i]=*it;
			ms.erase(it);
			ms.insert(reward[i]);
		}
		printf("%lld\n",solve()); 
	}
	return 0;
}
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... 阅读详情

相关推荐

优化求解器性能:当分支切割算法中的gap停滞不前时如何应对

本文深入探讨了当分支切割算法求解复杂整数规划问题时,gap停滞不前的根本原因与应对策略。文章指出gap停滞源于上界(找不到更优整数解)或下界(证明过程缓慢)提升受阻,并提供了从模型改写、自定义割平面、调整搜索策略到参数调优等一系列实战方法,帮助优化工程师有效打破求解僵局,推动gap下降。

weixin_29294597的博客 381

NOI2018:屠龙勇士

题面 具体思路:发现对于每条巨龙,用的剑是一样的,那么可以用map先处理出来 然后对于每个龙就是一个一次同余方程,然后n条龙就是一个方程组,那么就是个CRT了 由于可能爆long long,要用龟速快速乘(考试时没想到结果爆成暴力分) AC代码 #include<bits/stdc++.h> using namespace std; #define i...

a380988182的博客 206

ABB AC500 系列 PLC 与上位机iFix 的通讯配置

在 软件中,有 3 种方式可以进入 IP config tool 的配置界面 双击 IP_settings,点击 IP config tool,即可进入 IP config tool 界面点击菜单栏的 Tool→IP config如果单独安装了 ABB IP Configration,则可以通过开始→程序→ABB→ABB IPConfigration 启动 IP 配置工具启动 IP config tool 后,即可进入 IP 配置界面。

xdpcxq的专栏 4030

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

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

mango09の世界 353

【脑电信号处理与特征提取】P2-夏晓磊:脑电的神经起源与测量

ElectroEncephaloGraphyTherefore, EEG produces a graphed representation of the electrical activity occurring in a person’s brain.(把一个人的大脑中的电活动画出来)脑电头皮表面记录到的大脑活动产生的电信号(微伏)。(记录位置:硬脑膜/大脑皮层表面- ECoG,神经元群- LFP与MUR/MUA:活动位置:心电、眼电、肌电等)脑电图电压随时间变化的波形图。

m0_51474171的博客 1893

AUTOSAR实战:手把手教你配置EthTsync模块,搞定车载以太网时间同步

本文详细解析AUTOSAR架构中EthTsync模块的配置方法,实现车载以太网时间同步。通过对比gPTP与PTP协议差异,提供从开发环境准备到参数配置、模块集成的全流程指南,并分享性能优化与调试技巧,帮助开发者实现微秒级同步精度,满足自动驾驶等高精度时间同步需求。

weixin_28736335的博客 372

【NOI2018】屠龙勇士

我写的是85分的算法。至于我怎么过的,你一看就知道了。 请不要看本蒟蒻的Code了。 #include &amp;lt;bits/stdc++.h&amp;gt; using namespace std ; typedef long long ll ; const int N = 100010 ; multiset &amp;lt;ll&amp;gt; s ; multiset &amp;lt;ll&amp;gt; ::iterato...

Hacheylight 502

异步复位同步释放:如何确保复位信号的可靠性与时序安全

本文深入探讨了异步复位同步释放技术在数字电路设计中的关键作用,详细分析了复位信号的可靠性与时序安全问题。通过对比异步复位与同步复位的本质区别,揭示异步复位的优势与潜在风险,并提供了标准的Verilog实现方案。文章还涵盖了多时钟域下的复位同步策略、复位网络时序约束方法以及实际工程中的经验教训,为数字系统设计者提供了全面的复位信号处理指南。

weixin_29213655的博客 399

「NOI2018」屠龙勇士(EXCRT)

「NOI2018」屠龙勇士(EXCRT) 终于把传说中 \(NOI2018D2\) 的签到题写掉了。。。 开始我还没读懂题目。。。而且这题细节巨麻烦。。。(可能对我而言) 首先我们要转换一下,每次的 \(atk[i]\) 都可以用 \(multiset\) 找。 我们发现题目求的是 \(atk*x\equiv a_i(\text{mod}\ p_i)\),所以我们做一遍 \(exgcd\),求出同...

weixin_30488085的博客 190

Attention优化|2w字原理&图解: 从Online-Softmax到FlashAttention V1/V2/V3

本文通过原理分析和图解的方式,通俗易懂地FlashAttention系列算法。FlashAttention V1/V2在LLM领域的应用已经非常广泛,相关的论文也反复读了几遍。FA1和FA2论文非常经典,都推荐读一下(不过FA2论文中公式错误不少本文大约1.8w字,包括以下内容:0x07 分布式训推使用FlashAttention0x09 FlashAttention中MQA/GQA以及Causal Mask处理。

具身机器人和通用AI 5232

如何创建 SAP ABAP CDS View 的 Association

所以本文我们虽然学习了如何创建 SAP CDS View 的 association,知道了 association 是用来在 CDS View 里将两张数据库表关联起来,但根本不知道怎么使用这个 association. 而且从 association 的写法来看,似乎和本教程之前介绍 inner join,left join 这些数据库表的连接操作没什么区别,都是根据两张表的 carrid 和 connid 字段相同进行的连接。只看到了我们在 CDS View 源代码实现里,放出来的四个字段。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 902

BZOJ_5418_[Noi2018]屠龙勇士_exgcd+excrt

BZOJ_5418_[Noi2018]屠龙勇士_exgcd+excrt Description www.lydsy.com/JudgeOnline/upload/noi2018day2.pdf 每次用哪吧剑显然用个set就搞定了。 对于每头龙,生命值ai,回血pi,剑的攻击力为atk,打的次数为ans。 显然有ans*atk-ai>=0&&pi|...

126

zemax 如何编译用户自定义DLL(含VS下载教程)

zemax 如何编译用户自定义DLL(含VS下载教程)

weixin_72050316的博客 491

[gmoj 7183] 「NOI2018」屠龙勇士 luoguP4774 [NOI2018] 屠龙勇士[excrt][exgcd]

「NOI2018」屠龙勇士 link 思路: 把取出的宝剑攻击力设为T,可得 Ti*x=ai(mod pi), 这显然是ax=c(mod b)的形式, 这部分用exgcd求解x的最小正整数解先把a,b,c除以gcd(a,b), 如果c不能整 除gcd(a,b)那么无解。 此时a,b互质,用 exgcd求得a的逆元, 逆元乘回来gcd(a,b)就是x的最小正整数解, 注意可能爆long long要用龟速乘那么此时 求得x是仅仅对于这一个方程的, 我们要把它带到excrt的板子中求得x关于所有方程 都成立的

蒟蒻こんにゃく 155

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Luogu4774 NOI2018 屠龙勇士 ExCRT

传送门 原来NOI也会出裸题啊…… 用multiset求出对付每一个BOSS使用的武器威力\(ATK_i\),可以得到\(m\)个式子\(ATK_ix \equiv a_i \mod p_i\) 看起来可以直接魔改式子了…… 等一下!如果\(a_i > p_i\),\(ATK_ix<a_i\)没把BOSS打死怎么办QAQ 看数据范围,没有特性1(\(a_i \leq p_i\))的点...

weixin_30929295的博客 156

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

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

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

仙都一普通市民的blog 275

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

[LOJ#2721] [NOI2018] 屠龙勇士 [ExCRT]

Link-Cut-Tree LOJ - https://loj.ac/problem/2721 Luogu - https://www.luogu.org/problemnew/show/P4774 BZOJ - https://www.lydsy.com/JudgeOnline/problem.php?id=5418 Deskappation 有 nnn 条巨da的黑炎龙(Darkflame’...

最后一次修改 333

[BZOJ5418][excrt]NOI2018:屠龙勇士

BZOJ5418 excrt模板 题面很长,仔细读题后就可以发现每次必须打死巨龙,否则就输了 并且每次选择的剑是固定的,可以用set维护 然后问题就转化为求解n个不定方程组成的方程组,其中第i个方程为: ai+y∗pi−x∗atki=0a_i+y*p_i-x*atk_i=0ai​+y∗pi​−x∗atki​=0x∗atki−y∗pi=aix*atk_i-y*p_i=a_ix∗atki​−y∗pi​...

romiqi 170

NOI 2018 屠龙勇士(exgcd,excrt)

题目 对于方程ax≡b(modp)ax \equiv b \pmod pax≡b(modp) 记gcd⁡(a,p)=g\gcd(a,p) = ggcd(a,p)=g 则求出ax≡g(modp)ax \equiv g \pmod pax≡g(modp)的一组特解x0x_0x0​后。 若b mod g≠0b \bmod g \neq 0bmodg​=0 则无解。 否则原方程等价于x≡x0bg(modpg)x \equiv \frac {x_0b}g \pmod {\frac pg}x≡gx0​b​(modgp

Freopen的博客 226

[NOI2018]屠龙勇士

[NOI2018]屠龙勇士 显然每一只龙被哪只剑砍是确定的,我们可以通过\(multiset\)做出来.不妨令\(atk_i\)表示攻击第\(i\)只龙的剑的攻击值. 那么接下来我们将题目意思简化,相当于是求: \[ \begin{cases} atk_1*x\equiv a_1(mod\ p_1)\\ atk_2*x\equiv a_2(mod\ p_2)\\ ...\\ atk_n*...

aaet93794的博客 308

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

【洛谷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

[NOI2018]屠龙勇士(exCRT)

首先很明显剑的选择是唯一的,直接用multiset即可。   接下来可以发现每条龙都是一个模线性方程。设攻击第i条龙的剑的攻击力为$s_i$,则$s_ix\equiv a_i\ (mod\ p_i)$。   现在需要将方程化成$x\equiv c_i\ (mod\ m_i)$的形式,从而使用exCRT解决。   变式:$s_ix+p_iy=a_i$,先同除以$gcd(s_i,p_i)$,再使...

weixin_30378623的博客 140
上一篇: 扩展中国剩余定理(EXCRT)
下一篇: SDOI 2016 排列计数
WedsonLin
博客等级 码龄7年 1粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值