传送门

这题真的是送温暖啊qwq,而且最重要的是yyb巨佬在Day2前几天正好学了crt,还写了博客 然而我都没仔细看,结果我就同步赛打铁了QAQ

我们可以先根据题意,使用set维护,求出每次的攻击力

然后对于一条龙,要使得砍到生命值能加到0,那么 攻击力\(a_i\) * 次数\(x\) 要和 血量\(b_i\) 在膜 回复量\(p_i\) 意义下同余,也就是\(a_ix\equiv b_i\mod p_i\)

然后就是n个这样的方程,求最小的x

首先对于每个方程,考虑转化成\(x\equiv a\mod b\)的形式,原方程等价于$$a_ix+p_iy=b_i$$

首先用\(exgcd\)求出\(a_ix+p_iy=gcd(a_i,p_i)\)的一组解\((x,y)\),然后如果\(b_i \ne 0\mod gcd(a_i,p_i)\),那么无解,否则等式两边可以除掉gcd然后乘上\(b_i\),即$$a_i\frac{b_ix}{gcd(a_i,p_i)}+p_i\frac{b_iy}{gcd(a_i,p_i)}=b_i$$

记\({a'}_i=\frac{b_ix}{gcd(a_i,p_i)},{p'}_i=\frac{p_i}{gcd(a_i,p_i)}\)我们得到了n个形如\(x\equiv {a'}_i\mod {p'}_i\)的方程,右转洛谷题解蒯一份\(excrt\)即可

#include<bits/stdc++.h>
#define LL long long
#define ldb long double
#define il inline
#define re register using namespace std;
const int N=1e5+10;
il LL rd()
{
LL x=0,w=1;char ch=0;
while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*w;
}
il LL smul(LL a,LL b,LL mod){return ((a*b-(LL)((ldb)a/mod*b)*mod)%mod+mod)%mod;}
il void exgcd(LL a,LL b,LL &d,LL &x,LL &y)
{
if(!b) {d=a,x=1,y=0;return;}
exgcd(b,a%b,d,y,x),y-=a/b*x;
}
int n,m;
LL a[N],aa[N],b[N],p[N];
multiset<LL> s1,s2;
multiset<LL>::iterator it; int main()
{
int T=rd();
while(T--)
{
s1.clear(),s2.clear();
bool o=1,ff=0;
n=rd(),m=rd();
for(int i=1;i<=n;++i) b[i]=rd();
for(int i=1;i<=n;++i) p[i]=rd(),ff|=p[i]!=1;
for(int i=1;i<=n;++i) aa[i]=rd();
while(m--)
{
LL x=rd();
s1.insert(x),s2.insert(-x);
}
for(int i=1;i<=n;++i)
{
it=s2.lower_bound(-b[i]);
if(it!=s2.end()) a[i]=-(*it);
else a[i]=*(s1.begin());
s1.erase(s1.find(a[i])),s2.erase(s2.find(-a[i]));
s1.insert(aa[i]),s2.insert(-aa[i]);
}
if(!ff)
{
LL ans=0;
for(int i=1;i<=n;++i) ans=max(ans,(b[i]+a[i]-1)/a[i]);
printf("%lld\n",ans);
continue;
}
for(int i=1;i<=n&&o;++i)
{
LL x,y,d;
exgcd(a[i],p[i],d,x,y),p[i]/=d;
if(b[i]%d) o=0;
a[i]=smul((x%p[i]+p[i])%p[i],b[i]/d,p[i]);
}
LL a1=a[1],p1=p[1];
for(int i=2;i<=n&&o;++i)
{
LL x,y,d,c=((a[i]-a1)%p[i]+p[i])%p[i];
exgcd(p1,p[i],d,x,y),p[i]/=d;
if(c%d) o=0;
x=(x%p[i]+p[i])%p[i];
x=smul(x,c/d,p[i]);
a1+=smul(p1,x,p1*p[i]),p1*=p[i],a1%=p1;
}
printf("%lld\n",o?a1:-1ll);
}
return 0;
}

md做这道题的时候一万个地方没开longlong,而且exgcd不知道为什么被我删掉了一个\(*x\) qwq

luogu 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 [NOI2018]屠龙勇士 [扩欧,中国剩余定理]

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

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

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

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

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

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

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

  8. uoj396 [NOI2018]屠龙勇士

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

  9. Luogu P4774 / LOJ2721 【[NOI2018]屠龙勇士】

    真是个简单坑题...++ 前置: exgcd,exCRT,STL-multiset 读完题不难发现,攻击每条龙用的剑都是可以确定的,可以用multiset求.攻击最少显然应该对于每一条龙都操作一次,即 ...

随机推荐

  1. a超链接设置样式

    /* divcss5对象内 a超链接设置样式 */ .divcss5 a:link{ color:#F00}/* 链接默认为红色 */ .divcss5 a:hover{ color:#000}/*  ...

  2. 洛谷P1477 假面舞会

    坑死了...... 题意:给你个有向图,你需要把点分成k种,满足每条边都是分层的(从i种点连向i + 1种点,从k连向1). 要确保每种点至少有一个. 求k的最大值,最小值. n <= 1e5, ...

  3. AOP实践--利用MVC5 Filter实现登录状态判断

    AOP有的翻译"面向切面编程",有的是"面向方面编程".其实名字不重要,思想才是核心,mvc的Filter让我们很 方便达到这种面向方面编程,就是在现有代码的基 ...

  4. bzoj1791[IOI2008]Island岛屿(基环树+DP)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1791 题目大意:给你一棵n条边的基环树森林,要你求出所有基环树/树的直径之和.n< ...

  5. 2018.11.26 QLU新生赛部分题解

    问题 L: 寄蒜几盒? 题目描述 现在有一个圆圈,圆圈上有若干个点,请判断能否在若干个点中选择三个点两两相连组成一个等边三角形? 这若干个点在圆圈上按顺时针顺序分布. 如果可以的话输出"Ye ...

  6. 洛谷 P1879 玉米田(状压DP入门题)

    传送门 https://www.cnblogs.com/violet-acmer/p/9852294.html 题解: 相关变量解释: int M,N; int plant[maxn][maxn];/ ...

  7. 简单贪心) Repair the Wall hdu2124

    Repair the Wall http://acm.hdu.edu.cn/showproblem.php?pid=2124 Time Limit: 5000/1000 MS (Java/Others ...

  8. 使用rdbtools工具来解析redis rdb文件

    工欲善其事必先利其器,日常工作中,好的工具能够高效的协助我们工作:今天介绍一款用来解析redis rdb文件的工具,非常好用.会之,受用无穷! 一.rdbtools工具介绍 源码地址:https:// ...

  9. 新建体(2):create or replace object创建存储包、存储过程、函数

    http://heisetoufa.iteye.com/blog/366957/ 创建一个package(包) 声明: create or replace package mpay_route is ...

  10. python要点简要-一日精通python

    Python2.x是历史,Python3.x是这门语言的现在和未来.Python2和3大约90%的地方都很相似的. 1.注释 单行注释:在注释的前面输入#号,如下: # 这是一条注释 多行注释:使用三 ...