好久没写了,写一篇凑个数。

题目分析:

这题不难想,讲一下中国剩余定理怎么扩展。

考虑$$\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] 屠龙勇士 【扩展中国剩余定理】的更多相关文章

  1. LOJ.2721.[NOI2018]屠龙勇士(扩展CRT 扩展欧几里得)

    题目链接 LOJ 洛谷 rank前3无压力(话说rank1特判打表有意思么) \(x*atk[i] - y*p[i] = hp[i]\) 对于每条龙可以求一个满足条件的\(x_0\),然后得到其通解\ ...

  2. 洛谷P4774 BZOJ5418 LOJ2721 [NOI2018]屠龙勇士(扩展中国剩余定理)

    题目链接: 洛谷 BZOJ LOJ 题目大意:这么长的题面,就饶了我吧emmm 这题第一眼看上去没法列出同余方程组.为什么?好像不知道用哪把剑杀哪条龙…… 仔细一看,要按顺序杀龙,所以获得的剑出现的顺 ...

  3. 扩展中国剩余定理学习笔记+模板(洛谷P4777)

    题目链接: 洛谷 题目大意:求同余方程组 $x\equiv b_i(mod\ a_i)$ 的最小正整数解. $1\leq n\leq 10^5,1\leq a_i\leq 10^{12},0\leq ...

  4. (伪)再扩展中国剩余定理(洛谷P4774 [NOI2018]屠龙勇士)(中国剩余定理,扩展欧几里德,multiset)

    前言 我们熟知的中国剩余定理,在使用条件上其实是很苛刻的,要求模线性方程组\(x\equiv c(\mod m)\)的模数两两互质. 于是就有了扩展中国剩余定理,其实现方法大概是通过扩展欧几里德把两个 ...

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

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

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

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

  7. 扩展中国剩余定理 (exCRT) 的证明与练习

    原文链接https://www.cnblogs.com/zhouzhendong/p/exCRT.html 扩展中国剩余定理 (exCRT) 的证明与练习 问题模型 给定同余方程组 $$\begin{ ...

  8. P4777 【模板】扩展中国剩余定理(EXCRT)/ poj2891 Strange Way to Express Integers

    P4777 [模板]扩展中国剩余定理(EXCRT) excrt模板 我们知道,crt无法处理模数不两两互质的情况 然鹅excrt可以 设当前解到第 i 个方程 设$M=\prod_{j=1}^{i-1 ...

  9. P4777 【模板】扩展中国剩余定理(EXCRT)

    思路 中国剩余定理解决的是这样的问题 求x满足 \[ \begin{matrix}x \equiv a_1(mod\ m_1)\\x\equiv a_2(mod\ m_2)\\ \dots\\x\eq ...

随机推荐

  1. java连接Mysql8

    相较于之前版本会有部分改动 pom依赖 <dependency> <groupId>mysql</groupId> <artifactId>mysql- ...

  2. 北京教育软件创业公司招 .net工程师

    北京教育软件创业公司,招 .net工程师,月工资2万左右,有合适的朋友帮忙推荐下,要求水平稍高一些的.产品目前用Winform开发的.创始人两个清华,一个北大.老板在美国待了七年回来的,爱人在清华教书 ...

  3. node express使用

    var express = require('express'); var app = express(); app 对象具有以下的方法: 路由HTTP请求:app.METHOD和app.param. ...

  4. configure: error: cannot guess build type; you must specify one解决方法

    原文地址:https://blog.csdn.net/hebbely/article/details/53993141 1.configure: error: cannot guess build t ...

  5. 行政区划sql数据脚本

    行政区划sql数据脚本 IF (EXISTS(SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[TB_Province]') ...

  6. Git Gerrit Code Review

    Gerrit Code Review | Gerrit Code Reviewhttps://www.gerritcodereview.com/

  7. 在C 与 C++混编中, 出现error LNK2019: 无法解析的外部符号 "int __cdecl main_(int,char * *)" (?main_@@YAHHPEAPEAD@Z),该符号在函数 main 中被引用

    main_ 这个函数的头文件 应该做标准化输出 : extern "C" int main_(int argc, char **argv);

  8. 902. Kth Smallest Element in a BST

    Given a binary search tree, write a function kthSmallest to find the kth smallest element in it. You ...

  9. vue中的跨域问题

    https://segmentfault.com/a/1190000011072725(原文)   使用vue-axios和vue-resource解决vue中调用网易云接口跨域的问题 注(api很重 ...

  10. js判断一个图片是否已经存在于缓存

    如下代码: var url = "http://......../image.jpg"; var img = new Image(); img.src = url;   if(im ...