传送门

题解

思路

由题目可知,一条龙被攻击 \(x\) 次并回复若干次后生命值恰好为 \(0\) 则死亡,可以得出如下式子:

\[\large ATK_i \cdot x \equiv a_i(\mod p_i)
\]

可推出,

\[\large x \equiv a_i \cdot ATK_i^{-1}(\mod p_i)
\]

需要求 \(ATK_i\) 在模 \(p_i\) 意义下的逆元。

我们自然会想到使用扩展欧几里得算法,但题中数据并不能保证 \(\gcd(ATK_i,p_i)\)。因此,需要将 \(ATK_i\)、\(a_i\) 和 \(p_i\) 同时除以 \(\gcd(ATK_i,p_i)\)。

此时,如果 \(\gcd(ATK_i,p_i) \nmid a_i\),那么此方程无解,方程组也无解。

于是我们得到了如下式子:

\[\large x \equiv \frac{a_i}{\gcd(ATK_i,p_i)} \cdot [\frac{ATK_i}{\gcd(ATK_i,p_i)}]^{-1}(\mod \frac{p_i}{\gcd(ATK_i,p_i)})
\]

看起来很吓人,但写起来一点也不吓人。

于是我们得到了一个标准的 exCRT 问题。直接套用求解即可。

注意,攻击次数 \(x\) 应当保证每一条龙打 \(x\) 下后生命值都不大于 \(0\)。不然回复不了。

实现

注意多测。

首先需要求出每条龙的 \(ATK\)。类似于求 \(a_i\) 在数组中的前驱。

可以用平衡树实现,但是 注意到标签里并没有平衡树 笔者平衡树写挂了 这样做太麻烦,于是我们使用multiset

在对每一个方程进行转化的过程中和 exCRT 中判断无解。

代码

\(\gcd\) 和 exgcd 就不放了,注意开__int128

对每一个方程进行转化:

bool calc()
{
for(int i=1;i<=n;i++)
{
long long gcd1=gcd(atk[i],p[i]);
if(a[i]%gcd1)
return 0;
atk[i]/=gcd1,p[i]/=gcd1,a[i]/=gcd1;
__int128 x,y;
exgcd(atk[i],p[i],x,y);
b[i]=a[i]*x%p[i];
}
return 1;
}

exCRT:

long long exCRT()
{
for(int i=2;i<=n;i++)
{
__int128 x,y;
__int128 gcd1=exgcd(p[1],p[i],x,y);
if((b[i]-b[1])%gcd1) return -1;
x*=(b[i]-b[1])/gcd1;
x%=p[i]/gcd1;
b[1]+=p[1]*x;
p[1]*=p[i]/gcd1;
}
b[1]=(b[1]%p[1]+p[1])%p[1];
return b[1];
}

主体部分:

注意多测

ms.clear();    //multiset
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",&rew[i]);
while(m--)
{
long long tmp;
scanf("%lld",&tmp);
ms.insert(tmp);
}
for(int i=1;i<=n;i++)
{
auto pos=ms.upper_bound(a[i]);
if(pos!=ms.begin())
pos--;
atk[i]=*pos;
ms.erase(pos);
ms.insert(rew[i]);
}
long long mtimes=0;
for(int i=1;i<=n;i++)
mtimes=std::max(mtimes,(long long)((a[i]+atk[i]-1)/atk[i])); //std::max()比较不了__int128
if(!calc())
printf("-1\n");
else
{
long long ans=exCRT();
if(ans==-1)
{
printf("-1\n");
continue;
}
long long tmp1=mtimes/p[1];
ans+=p[1]*tmp1;
if(ans<mti)
ans+=p[1];
printf("%lld\n",ans);
}

\[\huge End
\]

P4774 [NOI2018] 屠龙勇士 题解的更多相关文章

  1. P4774 [NOI2018]屠龙勇士

    P4774 [NOI2018]屠龙勇士 先平衡树跑出打每条龙的atk t[] 然后每条龙有\(xt \equiv a[i](\text{mod }p[i])\) 就是\(xt+kp[i]=a[i]\) ...

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

    洛谷题目链接:[NOI2018]屠龙勇士 因为markdown复制过来有点炸格式,所以看题目请戳上面. 题解: 因为杀死一条龙的条件是在攻击\(x\)次,龙恢复\(y\)次血量\((y\in N^{* ...

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

    链接:P4774 前言: 交了18遍最后发现是多组数据没清空/ll 题意: 其实就是个扩中. 分析过程: 首先发现根据题目描述的选择剑的方式,每条龙对应的剑都是固定的,有查询前驱,后继(在该数不存在前 ...

  4. 洛谷 P4774 / loj 2721 [NOI2018] 屠龙勇士 题解【同余】【exgcd】【CRT】

    推导过程存在漏洞+exCRT板子没打熟于是期望得分÷实际得分=∞? 题目描述 小 D 最近在网上发现了一款小游戏.游戏的规则如下: 游戏的目标是按照编号 \(1\sim n​\) 顺序杀掉 \(n​\ ...

  5. luogu P4774 [NOI2018]屠龙勇士

    传送门 这题真的是送温暖啊qwq,而且最重要的是yyb巨佬在Day2前几天正好学了crt,还写了博客 然而我都没仔细看,结果我就同步赛打铁了QAQ 我们可以先根据题意,使用set维护,求出每次的攻击力 ...

  6. (伪)再扩展中国剩余定理(洛谷P4774 [NOI2018]屠龙勇士)(中国剩余定理,扩展欧几里德,multiset)

    前言 我们熟知的中国剩余定理,在使用条件上其实是很苛刻的,要求模线性方程组\(x\equiv c(\mod m)\)的模数两两互质. 于是就有了扩展中国剩余定理,其实现方法大概是通过扩展欧几里德把两个 ...

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

    传送门 思路 首先可以发现打每条龙的攻击值显然是可以提前算出来的,拿multiset模拟一下即可. 一般情况 可以搞出这么一些式子: \[ atk_i\times x=a_i(\text{mod}\ ...

  8. BZOJ5418[Noi2018]屠龙勇士——exgcd+扩展CRT+set

    题目链接: [Noi2018]屠龙勇士 题目大意:有$n$条龙和初始$m$个武器,每个武器有一个攻击力$t_{i}$,每条龙有一个初始血量$a_{i}$和一个回复值$p_{i}$(即只要血量为负数就一 ...

  9. BZOJ_5418_[Noi2018]屠龙勇士_exgcd+excrt

    BZOJ_5418_[Noi2018]屠龙勇士_exgcd+excrt Description www.lydsy.com/JudgeOnline/upload/noi2018day2.pdf 每次用 ...

  10. uoj396 [NOI2018]屠龙勇士

    [NOI2018]屠龙勇士 描述 小 D 最近在网上发现了一款小游戏.游戏的规则如下: 游戏的目标是按照编号 1∼n 顺序杀掉 n 条巨龙,每条巨龙拥有一个初始的生命值 ai .同时每条巨龙拥有恢复能 ...

随机推荐

  1. MySQL用错了,99%的人已中招

    在我们日常工作中,可能会经常使用MySQL数据库,因为它是开源免费的,而且性能还不错. 在国内的很多公司中,经常被使用. 但我们在MySQL使用过程中,也非常容易踩坑,不信继续往下看. 今天这篇文章重 ...

  2. 基于 .NET 开发的多功能流媒体管理控制平台

    前言 今天大姚给大家分享一个基于 .NET 开发且开源(MIT License)的多功能流媒体管理控制平台:AKStream. 项目介绍 AKStream是一个基于.NET开发且开源(MIT Lice ...

  3. 通用的定时任务工具 schedule-server

    背景: 我曾经在一个自动化测试平台中集成定时任务,基于 APScheduler 库花了好长时间解决重复执行的问题.定时任务集成在服务中也让服务变得复杂.最后,我们选择了公司其他团队go语言开发的一个定 ...

  4. 使用Tailwind CSS的几个小Tips

    前情 Tailwind CSS 是一个原子类 CSS 框架,它将基础的 CSS 全部拆分为原子级别.它的工作原理是扫描所有 HTML 文件.JavaScript 文件以及任何模板中的 CSS 类名,然 ...

  5. 协议Fuzz技术

    文章一开始发表在微信公众号 https://mp.weixin.qq.com/s?__biz=MzUyNzc4Mzk3MQ==&mid=2247486230&idx=1&sn= ...

  6. ArkTs布局入门04——相对布局 & 媒体查询

    1.相对布局 1.1.概述 RelativeContainer为采用相对布局的容器,支持容器内部的子元素设置相对位置关系.子元素支持指定兄弟元素作为锚点,也支持指定父容器作为锚点,基于锚点做相对位置布 ...

  7. AD使用插件生成交互式BOM

    AD使用插件生成交互式BOM 效果图镇楼: 下面来说一下怎么搞,过程其实也很简单,就加载一个脚本的事儿. 1.下载AD用交互式BOM插件 首先前往GitHub下载这位大佬开发的插件 地址:https: ...

  8. WebP图片使用踩坑

    前情 WebP是一种同时提供了有损压缩与无损压缩(可逆压缩)的图片文件格式,最初在2010年发布,目标是减少文件大小,相较于传统的 PNG.JPG,甚至是动图 GIF 的格式,WebP 比它们的空间更 ...

  9. Intel Pin初探

    1.在/home/hf/Desktop/pin/pin-3.30-98830-g1d7b601b3-gcc-linux/source/tools/ManualExamples/目录下写自己的pinto ...

  10. 在 ASP.NET Core 中进行打包 (Bundling) 和紧缩 (Minification)

    在 ASP.NET Core 中进行打包 (Bundling) 和紧缩 (Minification) Bundler & Minifier for Visual Studio 2019 Bun ...