显然multiset求出每次用哪把剑。注意到除了p=1的情况,其他数据都保证了ai<pi,于是先特判一下p=1。比较坑的是还可能存在ai=pi,稍微考虑一下。

  剩下的部分即解bix≡ai(mod pi)方程组。没有保证模数互质,于是excrt一发。excrt实际上就是不停exgcd合并两个方程。

  这次是重开这题,调了半天还是一堆-1觉得这个题可能是搞不会了,最后才发现某个地方没开long long。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<set>
#include<cassert>
using namespace std;
#define ll long long
#define N 100010
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<''||c>'')) c=getchar();return c;}
ll gcd(ll n,ll m){return m==?n:gcd(m,n%m);}
ll lcm(ll n,ll m){return n*(m/gcd(n,m));}
ll read()
{
ll x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
int T,n,m;
ll b[N],p[N],a[N],rwd[N];
multiset<ll> q;
ll ksc(ll a,ll b,ll p)
{
ll t=a*b-(ll)((long double)a*b/p+0.5)*p;
return t<?t+p:t;
}
void exgcd(ll a,ll b,ll &x,ll &y)
{
if (b==)
{
x=,y=;
return;
}
exgcd(b,a%b,x,y);
ll t=x;x=y;y=t-a/b*x;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("bzoj5418.in","r",stdin);
freopen("bzoj5418.out","w",stdout);
const char LL[]="%I64d\n";
#else
const char LL[]="%lld\n";
#endif
T=read();
while (T--)
{
n=read(),m=read();
for (int i=;i<=n;i++) a[i]=read();
for (int i=;i<=n;i++) p[i]=read();
for (int i=;i<=n;i++) rwd[i]=read();
q.clear();
for (int i=;i<=m;i++) q.insert(read());
for (int i=;i<=n;i++)
{
multiset<ll>::iterator it=q.upper_bound(a[i]);
if (it!=q.begin()) it--;
b[i]=*it;q.erase(it);q.insert(rwd[i]);
}
bool issp=;
for (int i=;i<=n;i++) if (p[i]!=) {issp=;break;}
ll ans=;
if (issp) for (int i=;i<=n;i++) ans=max(ans,(a[i]-)/b[i]+);
else
{
issp=;
for (int i=;i<=n;i++) if (a[i]!=p[i]) {issp=;break;}
if (issp)
{
ans=;
for (int i=;i<=n;i++)
if (b[i]%p[i]) b[i]%=p[i],ans=lcm(ans,p[i]/gcd(b[i],p[i]));
}
else
{
for (int i=;i<=n;i++)
if (b[i]%p[i]==&&a[i]!=b[i]||a[i]%gcd(b[i],p[i])) {ans=-;break;}
else
{
b[i]%=p[i];
int x=gcd(b[i],p[i]);
a[i]/=x,b[i]/=x,p[i]/=x;
}
if (~ans)
{
ll tmp;exgcd(b[],p[],ans,tmp);ans=(ans%p[]+p[])%p[];ans=ksc(ans,a[],p[]);
for (int i=;i<=n;i++)
{
ll A=ksc(b[i],p[i-],p[i]),B=(a[i]-ksc(b[i],ans,p[i])+p[i])%p[i];
ll x=gcd(p[i],p[i-]);if (B%x) {ans=-;break;}
A/=x,B/=x,p[i]/=x;
ll k;exgcd(A,p[i],k,tmp);k=(k%p[i]+p[i])%p[i];k=ksc(k,B,p[i]);
p[i]*=p[i-];ans=(ksc(k,p[i-],p[i])+ans)%p[i];
}
}
}
}
printf(LL,ans);
}
return ;
}

BZOJ5418 NOI2018屠龙勇士(excrt)的更多相关文章

  1. BZOJ5418:[NOI2018]屠龙勇士(exCRT,exgcd,set)

    Description Input Output Sample Input 23 33 5 74 6 107 3 91 9 10003 23 5 64 8 71 1 11 1 Sample Outpu ...

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

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

  3. Luogu4774 NOI2018 屠龙勇士 ExCRT

    传送门 原来NOI也会出裸题啊-- 用multiset求出对付每一个BOSS使用的武器威力\(ATK_i\),可以得到\(m\)个式子\(ATK_ix \equiv a_i \mod p_i\) 看起 ...

  4. [NOI2018]屠龙勇士(exCRT)

    首先很明显剑的选择是唯一的,直接用multiset即可. 接下来可以发现每条龙都是一个模线性方程.设攻击第i条龙的剑的攻击力为$s_i$,则$s_ix\equiv a_i\ (mod\ p_i)$. ...

  5. BZOJ 5418: [Noi2018]屠龙勇士 EXCRT+multiset

    题解:求解形如 $A[i]ans\equiv b[i](mod$ $p[i])$ 的 $x$ 的最小正整数解. 考虑只有一个等式,那么可以直接化成 $exgcd$ 的形式:$A[i]ans+p[i]y ...

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

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

  7. P4774 [NOI2018]屠龙勇士

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

  8. uoj396 [NOI2018]屠龙勇士

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

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

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

随机推荐

  1. 蓝桥杯 历届试题 约数倍数选卡片 (经典数论+DFS)

    闲暇时,福尔摩斯和华生玩一个游戏: 在N张卡片上写有N个整数.两人轮流拿走一张卡片.要求下一个人拿的数字一定是前一个人拿的数字的约数或倍数.例如,某次福尔摩斯拿走的卡片上写着数字“6”,则接下来华生可 ...

  2. linux中分区、格式化文件系统、挂载

    以前学linux的时候,毕竟自己没搞运维,就只注重了很多命令的运用,没太在意文件系统这块.买了本linux的书,这部分看了点东西,记个笔记哈哈. 有个场景,比如说我们现在的服务器上存储不够用了,那么当 ...

  3. VMware 克隆多台Linux机器并配置IP

    1.查看并分配虚拟网络 我们首先要知道 VMware 三种网络模式的区别. ①.Bridged(桥接模式):就是将主机网卡与虚拟机虚拟的网卡利用虚拟网桥进行通信.在桥接的作用下,类似于把物理主机虚拟为 ...

  4. Scala _ 下划线

    1.引入包中的全部方法 import math._ //引入包中所有方法,与java中的*类似 2.表示集合元素 val a = (1 to 10).filter(_%2==0).map(_*2) / ...

  5. 2017-2018-2 20155203《网络对抗技术》Exp4 恶意代码分析

    1. 实践过程记录 1. 使用Windows计划任务schtasks监控系统运行 Windows计划任务schtasks监控系统: 在C盘建立一个netstatlog.bat文件,用来将记录的联网结果 ...

  6. MFC CHotKeyCtrl控件

    知识点: CHotKeyCtrl控件 获取热键数据 注册热键 响应热键事件 一.CHotKeyCtrl控件 void SetHotKey( WORD wVirtualKeyCode, WORD wMo ...

  7. 初识TPOT:一个基于Python的自动化机器学习开发工具

    1. TPOT介绍 一般来讲,创建一个机器学习模型需要经历以下几步: 数据预处理 特征工程 模型选择 超参数调整 模型保存 本文介绍一个基于遗传算法的快速模型选择及调参的方法,TPOT:一种基于Pyt ...

  8. libgdx学习记录10——Particle粒子

    粒子对制作画面特效很有用,可以使用Particle Editor进行自行编辑粒子效果,跟图片一起生成.p粒子文件,然后导入到程序中使用. 本文所用的粒子效果是基于其自带的demo的. 实例: pack ...

  9. Mysql + Mybatis动态建表

    service层业务 package com.zx.common.service.impl; import com.zx.common.entity.SysUser; import com.zx.co ...

  10. stl源码剖析 详细学习笔记 仿函数

    //---------------------------15/04/01---------------------------- //仿函数是为了算法而诞生的,可以作为算法的一个参数,来自定义各种操 ...