【[NOI2018]屠龙勇士】
发现好像都是化掉系数之后套上\(ExCrt\)的板子
这好像是一个真正的扩展扩展中国剩余定理
我们要处理的方程是这样的形式
\]
其中\(c\)用一个\(std::multiset\)处理就好了
好像不是普通\(excrt\)可以处理的形式啊
思考一下这个方程的本质是什么,\(c_ix=k_ia_i+b_i\)
所以如果我们有两个方程
\]
\]
我们需要像\(crt\)那样合并起来
我们开始化柿子了
\]
所以就有
\]
\]
根据贝祖定理,这个方程有解条件是\(gcd(a_2c_1,a_1c_2)|(b_1c_2-b_2c_1)\)
如果有解的话,我们设\(t=gcd(a_2c_1,a_1c_2)\),两边除以\(t\)
\]
显然我们可以写成一个同余式
\]
之后设\(inv=(\frac{a_2c_1}{t},\frac{a_1c_2}{t})\),即\(\frac{a_2c_1}{t}\)在\(mod\) \(\frac{a_1c_2}{t}\)意义下的乘法逆元
两边乘以\(inv\)
\]
改写成等式
\]
我们把\(k_2\)回带到\(c_2x=k_2a_2+b_2\)
\]
再改写成同余式
\]
我们只需要顺次合并这些方程就好了,一旦出现无解就输出\(-1\)好了
一个坑点是\(a=1\)时解出来会是\(0\),好像和实际要求不太一样,所以对于这样情况直接模拟特判就好了
之后因为非常的懒没用快速乘,用了__int128
代码
#include<iostream>
#include<cstring>
#include<cstdio>
#include<set>
#define re register
#define maxn 100005
#define LL __int128
#define min(a,b) ((a)<(b)?(a):(b))
#define INF 9999999999999
#define max(a,b) ((a)>(b)?(a):(b))
#define set_it std::multiset<LL>::iterator
std::multiset<LL> s;
int n,m;
LL a[maxn],b[maxn],c[maxn],res[maxn];
LL gcd(LL a,LL b){ return !b?a:gcd(b,a%b);}
LL exgcd(LL a,LL b,LL &x,LL &y)
{
if(!b) return x=1,y=0,a;
LL r=exgcd(b,a%b,y,x);
y-=a/b*x;
return r;
}
inline LL pre(LL x)
{
s.insert(x);
set_it i=s.find(x);
if(i==s.begin()) return -INF;
--i;return *i;
}
inline void del(LL x)
{
set_it i=s.find(x);
s.erase(i);
}
inline int check(LL x)
{
if(s.find(x)!=s.end()) return 1;
return 0;
}
inline LL read()
{
char c=getchar();
LL x=0;
while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9')
x=(x<<3)+(x<<1)+c-48,c=getchar();
return x;
}
inline LL inv(LL a,LL b)
{
LL x,y;
LL r=exgcd(a,b,x,y);
return (x%b+b)%b;
}
void write(LL x)
{
if(x>9) write(x/10);
putchar(x%10+48);
}
inline LL did(LL a,LL b)
{
if(a%b==0) return a/b;
return a/b+1;
}
inline void tepan()
{
LL ans=0;
for(re int i=1;i<=n;i++)
ans=max(ans,did(b[i],c[i]));
write(ans),puts("");
}
inline void solve()
{
s.clear();
LL x;
int flag=0;
n=read(),m=read();
for(re int i=1;i<=n;i++) b[i]=read();
for(re int i=1;i<=n;i++) a[i]=read(),flag|=(a[i]!=1);
for(re int i=1;i<=n;i++) res[i]=read();
for(re int i=1;i<=m;i++) x=read(),s.insert(x);
for(re int i=1;i<=n;i++)
{
if(check(b[i])) c[i]=b[i],del(b[i]);
else
{
LL now=pre(b[i]);
del(b[i]);
if(now==-INF)
{
set_it it=s.begin();
c[i]=*it;
s.erase(it);
}
else c[i]=now,del(now);
}
s.insert(res[i]);
}
if(!flag)
{
tepan();
return;
}
LL a1=a[1],b1=b[1],c1=c[1];
for(re int i=2;i<=n;i++)
{
LL a2=a[i],b2=b[i],c2=c[i];
LL r=gcd(c2*a1,c1*a2);
if((b1*c2-b2*c1)%r)
{
puts("-1");
return;
}
if((c2*a1/r)<(c1*a2/r)) std::swap(a1,a2),std::swap(b1,b2),std::swap(c1,c2);
LL P=a1*c2/r,Inv=inv(c1*a2/r,a1*c2/r);
b1=((Inv*(((b1*c2-b2*c1)/r)%P+P)%P*a2))+b2;
a1=a1*a2*c2/r;
c1=c2;
}
LL y;
if(b1%gcd(a1,c1))
{
puts("-1");
return;
}
LL r=exgcd(c1,a1,x,y);
LL t=a1/r;
x=(x*(b1/r)%t+t)%t;
write(x);
puts("");
}
int main()
{
int T;
T=read();
while(T--) solve();
return 0;
}
【[NOI2018]屠龙勇士】的更多相关文章
- BZOJ5418[Noi2018]屠龙勇士——exgcd+扩展CRT+set
题目链接: [Noi2018]屠龙勇士 题目大意:有$n$条龙和初始$m$个武器,每个武器有一个攻击力$t_{i}$,每条龙有一个初始血量$a_{i}$和一个回复值$p_{i}$(即只要血量为负数就一 ...
- P4774 [NOI2018]屠龙勇士
P4774 [NOI2018]屠龙勇士 先平衡树跑出打每条龙的atk t[] 然后每条龙有\(xt \equiv a[i](\text{mod }p[i])\) 就是\(xt+kp[i]=a[i]\) ...
- [洛谷P4774] [NOI2018]屠龙勇士
洛谷题目链接:[NOI2018]屠龙勇士 因为markdown复制过来有点炸格式,所以看题目请戳上面. 题解: 因为杀死一条龙的条件是在攻击\(x\)次,龙恢复\(y\)次血量\((y\in N^{* ...
- BZOJ_5418_[Noi2018]屠龙勇士_exgcd+excrt
BZOJ_5418_[Noi2018]屠龙勇士_exgcd+excrt Description www.lydsy.com/JudgeOnline/upload/noi2018day2.pdf 每次用 ...
- uoj396 [NOI2018]屠龙勇士
[NOI2018]屠龙勇士 描述 小 D 最近在网上发现了一款小游戏.游戏的规则如下: 游戏的目标是按照编号 1∼n 顺序杀掉 n 条巨龙,每条巨龙拥有一个初始的生命值 ai .同时每条巨龙拥有恢复能 ...
- 洛谷 P4774 [NOI2018] 屠龙勇士
链接:P4774 前言: 交了18遍最后发现是多组数据没清空/ll 题意: 其实就是个扩中. 分析过程: 首先发现根据题目描述的选择剑的方式,每条龙对应的剑都是固定的,有查询前驱,后继(在该数不存在前 ...
- 洛谷P4774 [NOI2018]屠龙勇士 [扩欧,中国剩余定理]
传送门 思路 首先可以发现打每条龙的攻击值显然是可以提前算出来的,拿multiset模拟一下即可. 一般情况 可以搞出这么一些式子: \[ atk_i\times x=a_i(\text{mod}\ ...
- [NOI2018]屠龙勇士
题目描述 题解 考虑增量法. 假设我们已经做完了前k个条件,前面的模数连乘起来的结果为M,答案为X,当前的攻击力为x,龙的血量为a. 那么我们这一次的答案的表达形式是X+t*M的. 这一次需要满足的是 ...
- LOJ2721 [NOI2018] 屠龙勇士 【扩展中国剩余定理】
好久没写了,写一篇凑个数. 题目分析: 这题不难想,讲一下中国剩余定理怎么扩展. 考虑$$\left\{\begin{matrix}x \equiv a\pmod{b}\\ x \equiv c\pm ...
- Luogu P4774 / LOJ2721 【[NOI2018]屠龙勇士】
真是个简单坑题...++ 前置: exgcd,exCRT,STL-multiset 读完题不难发现,攻击每条龙用的剑都是可以确定的,可以用multiset求.攻击最少显然应该对于每一条龙都操作一次,即 ...
随机推荐
- 使用StackPanel进行简单地布局
尽管StackPanel非常简单,但是其实用性也非常强 ,Stackpanel将子元素以堆叠的形式 排列在一行或一列.通常建议使用该控件对于一些小范围内的控件进行布局. 如果要架设用户控件的框架结构, ...
- Jquery Easy UI初步学习(一)
Easy UI 1.3.2 以前听说Easy UI很不错,当了一个dome,闲着没事就看了一下,也整理一下为了自己更好的记忆,也希望对象我这样小菜有帮助吧 先从后台管理的主页面开始,如要要做主页需要了 ...
- iptables-linux(ls)-inode-block
Part1:iptables 环境:centos6.7 目前我只配置了INPUT.OUTPUT和FORWORD都是ACCEPT的规则 由于想要先实现防火墙规则,所以前面的内容讲的是方法,后面是详解ip ...
- [LeetCode]Maximum Subarray题解
Maximum Subarray: Find the contiguous subarray within an array (containing at least one number) whic ...
- Influxdb的存储引擎
创建Influxdb数据库时,我们可以看到下面选项,每个选项的含义就是本文要描述的: Influxdb内部数据的存储可以使用不同的存储引擎.当前0.8.7版本支持的是LevelDB, RocksDB, ...
- java队列queue的我觉得很好的使用方式
LinkedList实现了queue接口,通常使用LinkedList 其中关键两个函数:offer().poll() offer()表示“排队”----插入到队列最前,poll()表示轮到了队列最前 ...
- 《JavaWeb从入门到改行》很好的复习资料: SQL语句到底怎么写 ?
本文用到的数据库如下: CREATE DATABASE exam; /创建部门表/ CREATE TABLE dept( deptno INT PRIMARY KEY, dname ), loc ) ...
- 关于VUE中 import 、 export 和 export default 的注意问题
1.import引入一个依赖包,不需要相对路径.import 引入一个自己写的js文件,是需要相对路径的. 示例:import axios from ‘axios’; import AppServic ...
- 洛谷P2792 [JSOI2008]小店购物(最小树形图)
题意 题目链接 Sol 一开始的思路:新建一个虚点向每个点连边,再加上题面中给出的边,边权均为大小*需要购买的数量 然后发现死活都过不去 看了题解才发现题目中有个细节--买了\(A\)就可以买\(B\ ...
- ECharts 柱状图顶部显示百分比
1.引入jquery.js和echarts.js <script src="../jquery-1.8.3.min.js" type="text/javascrip ...