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

题目分析:

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

考虑$$\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. golang中的context包

    标准库的context包 从设计角度上来讲, golang的context包提供了一种父routine对子routine的管理功能. 我的这种理解虽然和网上各种文章中讲的不太一样, 但我认为基本上还是 ...

  2. 五、xadmin自定义插件2

    以导入插件为例说明: 1.在xadmin-->plugins下面新建excel.py文件 2.新建ListExcelImportPlugin类,继承BaseAdminPlugin from xa ...

  3. 海康威视笔试(C++)

    1. select和epoll的区别 2.服务器并发量之高性能服务器设计 3.SQL关键字 4.TCP乱序和重传的问题 5.c++对象内存分配问题 6.c++多线程 join的用法: Thread类的 ...

  4. Mike and gcd problem CodeForces - 798C (贪心思维+数论)

    题目链接 比较棒的一道题, 题意: 给你一个N个数的数组,让你用尽量少的操作使整个数组的gcd大于1,即gcd(a1 ,a2,,,,an) > 1 如果可以输出YES和最小的次数,否则输出NO ...

  5. pandas删除某一列的方法

    方法一:直接del df['column-name'] 删除sub_grade_列, 输入del df['sub_grade_x'] 方法二:采用drop方法,有下面三种等价的表达式: 1. df= ...

  6. MySQL 深入浅出数据库索引原理(转)

    本文转自:https://www.cnblogs.com/aspwebchh/p/6652855.html 前段时间,公司一个新上线的网站出现页面响应速度缓慢的问题, 一位负责这个项目的但并不是搞技术 ...

  7. Golang中进行reslice时的注意事项

    先看下面代码: package main import "fmt" func main() { slice := []int{0, 1, 2, 3, 4, 5, 6, 7, 8} ...

  8. Laravel5 创建自定义门面(Facade)

    门面为应用服务容器中的绑定类提供了一个“静态”接口.Laravel 内置了很多门面,你可能在不知道的情况下正在使用它们.Laravel 的门面作为服务容器中底层类的“静态代理”,相比于传统静态方法,在 ...

  9. Chrome 75 & lazy-loading

    Chrome 75 & lazy-loading https://addyosmani.com/blog/lazy-loading/ https://chromestatus.com/feat ...

  10. JS 原型和闭包

    原文:深入理解javascript原型和闭包(完结) JavaScript 中的难点和重要点,排除知识体系之外的 bug.本篇是学习笔记,记录个人理解. 一.一切皆对象:一切(引用类型)都是对象,对象 ...