LOJ2721 [NOI2018] 屠龙勇士 【扩展中国剩余定理】
好久没写了,写一篇凑个数。
题目分析:
这题不难想,讲一下中国剩余定理怎么扩展。
考虑$$\left\{\begin{matrix}x \equiv a\pmod{b}\\ x \equiv c\pmod{d}\end{matrix}\right.$$
不难发现需要满足$gcd(b,d)|(c-a)$才有解。
结合后的模数一定是$lcm(b,d)$。然后扩展gcd合并就行了。
中间过程会超过$10^18$,需要快速乘。
代码:
#include<bits/stdc++.h>
using namespace std; const int maxn = ; int n,m;
long long a[maxn],p[maxn],LP[maxn],d[maxn]; multiset<long long,greater<long long> > s; long long cut[maxn],minn;
long long st[maxn],f[maxn]; void init(){
s.clear();memset(st,,sizeof(st)); memset(f,,sizeof(f));
for(int i=;i<=m;i++) s.insert(d[i]);
for(int i=;i<=n;i++){
set<long long>::iterator it = s.lower_bound(a[i]);
if(it == s.end())it--; cut[i] = (*it);
s.erase(it); s.insert(LP[i]);
}
minn = ;
for(int i=;i<=n;i++) minn = max(minn,(long long)ceil((double)a[i]/cut[i]));
} long long exgcd(long long alpha,long long beta,long long &x,long long &y){
if(beta == ){x = ; y = ; return alpha;}
else{
long long res = exgcd(beta,alpha%beta,y,x);
y-=x*(alpha/beta);
return res;
}
} void read(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) scanf("%lld",&a[i]);
for(int i=;i<=n;i++) scanf("%lld",&p[i]);
for(int i=;i<=n;i++) scanf("%lld",&LP[i]);
for(int i=;i<=m;i++) scanf("%lld",&d[i]);
} long long multi(long long alpha,long long beta,long long mod){
long long dt,bit = ,ans = ;
alpha %= mod; beta %= mod;
alpha += mod; beta += mod;
alpha %= mod; beta %= mod;
dt = alpha;
while(bit <= beta){
if(bit & beta){ans += dt; if(ans >= mod) ans -= mod;}
bit<<=;dt = (dt+dt); if(dt >= mod) dt -= mod;
}
return ans;
} int cntt = ;
void work(){
for(int i=;i<=n;i++){
long long hd = exgcd(cut[i],p[i],st[i],f[i]);
if(a[i] % hd != ){puts("-1");return;}
f[i] = p[i]/hd; st[i] %= f[i]; if(st[i] < ) st[i] += f[i];
st[i] = multi(st[i],a[i]/hd,f[i]); st[i] %= f[i];
}
for(int i=;i<=n;i++){
long long im = exgcd(f[i],f[i-],f[],f[]);
if((st[i]-st[i-])%im){
puts("-1");return;
}
long long um = f[i]/im*f[i-];
long long tf=; exgcd(f[i-],f[i],tf,f[]);
tf =multi(tf,(st[i]-st[i-])/im,um);
tf += (-tf/f[i])*f[i]; tf += f[i];
tf = (st[i-]+multi(tf,f[i-],um))%um;
if(tf < ) tf += um;
f[i] = um; st[i] = tf;
}
if(st[n] < minn){
st[n] += (minn-st[n])/f[n]*f[n];
}
printf("%lld\n",st[n]);
//fast multi
} int main(){
int Tmp; scanf("%d",&Tmp);
while(Tmp--){
cntt++;
read();
init();
work();
}
return ;
}
LOJ2721 [NOI2018] 屠龙勇士 【扩展中国剩余定理】的更多相关文章
- LOJ.2721.[NOI2018]屠龙勇士(扩展CRT 扩展欧几里得)
题目链接 LOJ 洛谷 rank前3无压力(话说rank1特判打表有意思么) \(x*atk[i] - y*p[i] = hp[i]\) 对于每条龙可以求一个满足条件的\(x_0\),然后得到其通解\ ...
- 洛谷P4774 BZOJ5418 LOJ2721 [NOI2018]屠龙勇士(扩展中国剩余定理)
题目链接: 洛谷 BZOJ LOJ 题目大意:这么长的题面,就饶了我吧emmm 这题第一眼看上去没法列出同余方程组.为什么?好像不知道用哪把剑杀哪条龙…… 仔细一看,要按顺序杀龙,所以获得的剑出现的顺 ...
- 扩展中国剩余定理学习笔记+模板(洛谷P4777)
题目链接: 洛谷 题目大意:求同余方程组 $x\equiv b_i(mod\ a_i)$ 的最小正整数解. $1\leq n\leq 10^5,1\leq a_i\leq 10^{12},0\leq ...
- (伪)再扩展中国剩余定理(洛谷P4774 [NOI2018]屠龙勇士)(中国剩余定理,扩展欧几里德,multiset)
前言 我们熟知的中国剩余定理,在使用条件上其实是很苛刻的,要求模线性方程组\(x\equiv c(\mod m)\)的模数两两互质. 于是就有了扩展中国剩余定理,其实现方法大概是通过扩展欧几里德把两个 ...
- BZOJ5418[Noi2018]屠龙勇士——exgcd+扩展CRT+set
题目链接: [Noi2018]屠龙勇士 题目大意:有$n$条龙和初始$m$个武器,每个武器有一个攻击力$t_{i}$,每条龙有一个初始血量$a_{i}$和一个回复值$p_{i}$(即只要血量为负数就一 ...
- [洛谷P4774] [NOI2018]屠龙勇士
洛谷题目链接:[NOI2018]屠龙勇士 因为markdown复制过来有点炸格式,所以看题目请戳上面. 题解: 因为杀死一条龙的条件是在攻击\(x\)次,龙恢复\(y\)次血量\((y\in N^{* ...
- 扩展中国剩余定理 (exCRT) 的证明与练习
原文链接https://www.cnblogs.com/zhouzhendong/p/exCRT.html 扩展中国剩余定理 (exCRT) 的证明与练习 问题模型 给定同余方程组 $$\begin{ ...
- P4777 【模板】扩展中国剩余定理(EXCRT)/ poj2891 Strange Way to Express Integers
P4777 [模板]扩展中国剩余定理(EXCRT) excrt模板 我们知道,crt无法处理模数不两两互质的情况 然鹅excrt可以 设当前解到第 i 个方程 设$M=\prod_{j=1}^{i-1 ...
- P4777 【模板】扩展中国剩余定理(EXCRT)
思路 中国剩余定理解决的是这样的问题 求x满足 \[ \begin{matrix}x \equiv a_1(mod\ m_1)\\x\equiv a_2(mod\ m_2)\\ \dots\\x\eq ...
随机推荐
- Centos7修改系统时区
timedatectl status Local time: 四 2014-12-25 10:52:10 CST Universal time: 四 2014-12-25 02:52:10 UTC R ...
- 如何在Github中删除已有仓库或文件
一.删除已有仓库如果我们想要删除Github中没有用的仓库,应该如何去做呢? 进入到我们需要删除的仓库里面,找到“settings”即仓库设置: 然后,在仓库设置里拉到最底部,找到“Danger Zo ...
- 使用 Markdown编辑
作用: 学习笔记,整理日志, 发布日记,杂文,所见所想 撰写发布技术文稿(代码支持) 撰写发布学术论文(LaTeX 公式支持) sublime text3插件 输入 Shift + Ctrl + P, ...
- java.lang.LinkageError: JAXB 2.0 API is being loaded from the bootstrap classloader
我的解决办法: 1.如果是application工程,则在程序中打印出 system.out.println(System.getProperty("java.endo ...
- 使用postman发送post数据时遇到的问题
平时工作最多的内容就是写接口,免不了测试自己写的接口是否正确,postman就是一个不错的选择 使用postman最好了解一些http协议的知识,不然就会闹笑话,比如,下面这个图片中的做法,尝试发送p ...
- Tomcat集成Memcached Session Manager方案
http://repo1.maven.org/maven2/de/javakaffee/msm/memcached-session-manager/2.3.2/memcached-session-ma ...
- package-lock.json和package.json的作用
转自:https://www.cnblogs.com/cangqinglang/p/8336754.html package-lock.json的作用就是锁定安装依赖时包的版本,并且需要上传到git, ...
- IDEA将项目上传至码云/GitHub托管
怎么将本地的项目放到码云或者GitHub去托管了?(以码云为例) 一.创建远程项目 第一步:点击创建项目 第二步:填写项目相关信息 第三步:复制远程的项目地址,注意:此处码云官方已经给出上传项目方法, ...
- [转帖]ipvsadm命令参考及其应用例子
ipvsadm命令参考及其应用例子 https://blog.csdn.net/orichisonic/article/details/47375227 只是简单创建了 service和添加serve ...
- python学习笔记(5)-基本数据类型-字符串类型及操作
一.字符串 字符串由一对单引号或者双引号表示,如”abc“,‘中国’,字符串是字符的有序序列,可以对其中的字符进行索引.字符串也可以用三单引号或三双引号表示,可以表示多行字符串,一对单引号或双引号仅表 ...