BZOJ5418 NOI2018屠龙勇士(excrt)
显然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)的更多相关文章
- 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 ...
- BZOJ5418[Noi2018]屠龙勇士——exgcd+扩展CRT+set
题目链接: [Noi2018]屠龙勇士 题目大意:有$n$条龙和初始$m$个武器,每个武器有一个攻击力$t_{i}$,每条龙有一个初始血量$a_{i}$和一个回复值$p_{i}$(即只要血量为负数就一 ...
- Luogu4774 NOI2018 屠龙勇士 ExCRT
传送门 原来NOI也会出裸题啊-- 用multiset求出对付每一个BOSS使用的武器威力\(ATK_i\),可以得到\(m\)个式子\(ATK_ix \equiv a_i \mod p_i\) 看起 ...
- [NOI2018]屠龙勇士(exCRT)
首先很明显剑的选择是唯一的,直接用multiset即可. 接下来可以发现每条龙都是一个模线性方程.设攻击第i条龙的剑的攻击力为$s_i$,则$s_ix\equiv a_i\ (mod\ p_i)$. ...
- BZOJ 5418: [Noi2018]屠龙勇士 EXCRT+multiset
题解:求解形如 $A[i]ans\equiv b[i](mod$ $p[i])$ 的 $x$ 的最小正整数解. 考虑只有一个等式,那么可以直接化成 $exgcd$ 的形式:$A[i]ans+p[i]y ...
- BZOJ_5418_[Noi2018]屠龙勇士_exgcd+excrt
BZOJ_5418_[Noi2018]屠龙勇士_exgcd+excrt Description www.lydsy.com/JudgeOnline/upload/noi2018day2.pdf 每次用 ...
- P4774 [NOI2018]屠龙勇士
P4774 [NOI2018]屠龙勇士 先平衡树跑出打每条龙的atk t[] 然后每条龙有\(xt \equiv a[i](\text{mod }p[i])\) 就是\(xt+kp[i]=a[i]\) ...
- uoj396 [NOI2018]屠龙勇士
[NOI2018]屠龙勇士 描述 小 D 最近在网上发现了一款小游戏.游戏的规则如下: 游戏的目标是按照编号 1∼n 顺序杀掉 n 条巨龙,每条巨龙拥有一个初始的生命值 ai .同时每条巨龙拥有恢复能 ...
- [洛谷P4774] [NOI2018]屠龙勇士
洛谷题目链接:[NOI2018]屠龙勇士 因为markdown复制过来有点炸格式,所以看题目请戳上面. 题解: 因为杀死一条龙的条件是在攻击\(x\)次,龙恢复\(y\)次血量\((y\in N^{* ...
随机推荐
- P1522 牛的旅行 Cow Tours
题目描述 农民 John的农场里有很多牧区.有的路径连接一些特定的牧区.一片所有连通的牧区称为一个牧场.但是就目前而言,你能看到至少有两个牧区通过任何路径都不连通.这样,Farmer John就有多个 ...
- CAN设计与应用指南
CAN设计与应用指南 0.前言 这是我为公司写的一个关于CAN总线的入门文章,对全面理解CAN总线特性很有帮助,拿出来分享给大家. 1. 简介 CAN总线由德国BOSCH公司开发,最高速率可达到1Mb ...
- linux 《vmware下克隆的centos无法配置固定ip》
1.用vmware克隆一个centos 2.进入centos,打开命令行输入ifconfig,运行后发现没有eth0 3.运行网卡启动命令ifconfig eth0 up,再运行ifconfig wa ...
- bitmap过大无法显示图片的问题 - z
public Bitmap ratio(Bitmap image, float pixelW, float pixelH) {Bitmap bitmap = null;try {ByteArrayOu ...
- Android Studio常用快捷键 - 转
Android Studio常用快捷键 1. Ctrl+D: 集合了复制和粘贴两个操作,如果有选中的部分就复制选中的部分,并在选中部分的后面粘贴出来,如果没有选中的部分,就复制光标所在的行,并在此行的 ...
- RocEDU.课程设计2018 第二周进展 博客补交
本周计划完成的任务 (1).将开发板和平板电脑及其相关配件连通,并和电脑连接. (2).将代码的运行设备从安卓模拟器改为试验箱的平板电脑,平板电脑上实现软件. 本周实际完成情况 (1).计划完成的第一 ...
- 四、MYSQL的数据类型
类型选择原则 1.储存空间越少越好: 2.简单就好:例如整型比字符串更简单: 3.尽量避免null: 一.整数类型 1.有tinyint(8位).SMALLINT(16位).MEDIUMINT(24位 ...
- java 调用 linux 命令行 +使用管道、awk等命令进行数据处理的方法
这里用 sh -c "命令" 的方式是因为java里只能这么用,管道这边java处理不了,所以只能一次执行一条命令,但是在linux里用 sh -c 的方式返回的awk处理过的结果 ...
- Linux环境下使用n更新node版本失败的原因与解决
Linux环境为CentOS 6.5 64位,阿里云低配服务器...学生优惠,然而下个月即将过期,真是个悲伤的故事 很久之前就安装了node,但是一直没有进行过升级,近日因为将部分异步代码更新为采用原 ...
- Meteor入门介绍
Meteor是什么 基于nodejs的实时web APP开发框架. Meteor能带来什么 简单的说,你可以用js搞定客户端.服务端的开发.另外,客户端.服务端的界限被极大的模糊.客户端的界面跟服务端 ...