首先很明显剑的选择是唯一的,直接用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)$,再使用exgcd解不定方程,求x的最小正整数解。

  注意判无解,exCRT结束之后注意要使$x\geqslant max(\frac{a_i}{s_i})$

 #include<set>
#include<cstdio>
#include<algorithm>
#define rep(i,l,r) for (int i=(l); i<=(r); i++)
typedef long long ll;
using namespace std; const int N=;
multiset<ll>S;
bool mark;
int n,k,T;
ll mx,a[N],p[N],more[N],s[N],c[N],m[N]; ll gcd(ll a,ll b){ return b ? gcd(b,a%b) : a; } ll mul(ll a,ll b,ll mod){
ll res=; a%=mod; b%=mod;
for (; b; a=(a<<)%mod,b>>=)
if (b & ) res=(res+a)%mod;
return res;
} void exgcd(ll a,ll b,ll &x,ll &y){
if (!b){ x=; y=; return; }
exgcd(b,a%b,y,x); y-=(a/b)*x;
} ll inv(ll a,ll b){ ll x,y; exgcd(a,b,x,y); x=(x%b+b)%b; return x; } bool merge(ll c1,ll c2,ll m1,ll m2,ll &c3,ll &m3){
ll d=gcd(m1,m2); m3=m1/d*m2;
if (c2<c1) swap(c1,c2),swap(m1,m2);
if ((c2-c1)%d) return ;
c3=(mul(mul(inv(m1/d,m2/d),(c2-c1)/d,m2/d),m1,m3)+c1)%m3;
return ;
} void work(){
scanf("%d%d",&n,&k); mark=; mx=; S.clear();
rep(i,,n) scanf("%lld",&a[i]);
rep(i,,n) scanf("%lld",&p[i]);
rep(i,,n) scanf("%lld",&more[i]);
rep(i,,k) scanf("%lld",&s[i]),S.insert(s[i]);
rep(i,,n){
multiset<ll>::iterator it=S.upper_bound(a[i]);
if (it!=S.begin()) it--;
ll s=*it; S.erase(it); S.insert(more[i]);
mx=max(mx,(a[i]-)/s+);
ll d=gcd(s,p[i]);
if (a[i]%d) { mark=; break; }
m[i]=p[i]/d; c[i]=mul(inv(s/d,m[i]),a[i]/d,m[i]);
}
if (!mark) { puts("-1"); return; }
rep(i,,n) if (!merge(c[i-],c[i],m[i-],m[i],c[i],m[i])) { mark=; break; }
if (!mark) { puts("-1"); return; }
if (c[n]<mx) c[n]+=((mx-c[n]-)/m[n]+)*m[n];
printf("%lld\n",c[n]);
} int main(){
freopen("dragon.in","r",stdin);
freopen("dragon.out","w",stdout);
for (scanf("%d",&T); T--; ) work();
return ;
}

[NOI2018]屠龙勇士(exCRT)的更多相关文章

  1. Luogu4774 NOI2018 屠龙勇士 ExCRT

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

  2. 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 ...

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

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

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

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

  5. P4774 [NOI2018]屠龙勇士

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

  6. uoj396 [NOI2018]屠龙勇士

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

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

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

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

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

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

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

随机推荐

  1. [学习笔记]可持久化数据结构——数组、并查集、平衡树、Trie树

    可持久化:支持查询历史版本和在历史版本上修改 可持久化数组 主席树做即可. [模板]可持久化数组(可持久化线段树/平衡树) 可持久化并查集 可持久化并查集 主席树做即可. 要按秩合并.(路径压缩每次建 ...

  2. 用boost::lexical_cast进行数值转换

    在STL库中,我们可以通过stringstream来实现字符串和数字间的转换: int i = 0;    stringstream ss; ss << "123";  ...

  3. region xx not deployed on any region server

    ERROR: Region { meta => month_hotstatic,860010-2288000000_201405_5_exit_00000047486,1400144486405 ...

  4. input 只允许输入数字

    onkeyup='this.value=this.value.replace(/[^0-9\-]/gi,"")'

  5. JS中二维数组的声明

    var myarr=new Array(); //先声明一维 for(var i=0;i<2;i++){ //一维长度为2 myarr[i]=new Array(); //再声明二维 for(v ...

  6. DIV的变高与变宽

    代码: <!DOCTYPE HTML><html><head> <meta charset="utf-8"> <title&g ...

  7. 前端面试:css预处理

    css预处理定义: 定义了一种新的语言,其基本思想是用一种专门编程语言,为css增加了一些编程的特性,将css作为目标生成文件,然后开发者就只要使用这种语言进行编码工作. 几种预处理语言 sass l ...

  8. ES6学习笔记(三)—— Set 和 Map

    SetES6提供的数据结构,类似于数组,但是成员的值都是唯一的.(提供了一种数组去重的方法) Set 内部判断两个值是否相同使用的是 'Same-value equality',类似于 ===但是 N ...

  9. codefoeces 671 problem D

    D. Roads in Yusland standard output Mayor of Yusland just won the lottery and decided to spent money ...

  10. yum软件包安装

    使用yum安装软件 配置yum配置文件 cd /etc/yum.repos.d/ vim rhel7.repo [rhel7-source] name=rhel7-source baseurl=fil ...