屠龙勇士

很久很久以前,巨龙突然出现,带来了灾难带走公主又消失不见。王国十分危险,世间谁最勇敢,一位英雄出现……

学习于该大佬博客

那么你就是这位英雄,不过不同的是,你面对的是一群巨龙,虽然巨龙都不会攻击;你每次使用的剑一打就爆,虽然每打死一条巨龙的奖励是一把新的剑;巨龙不会因为生命值降为负数而死亡,虽然巨龙会憨憨地回血然后把自己奶死;最重要的是你完成游戏不会获得公主的爱,只会获得参加ION8012的报名机会。你一听到最后一条彻底就失去了兴致,于是写了一个机器人帮你完成任务XD

简单来说,就是求解同余方程组:

\[k_ix\equiv a_i(mod p_i)
\]

其中i为巨龙个数1-n。

然鹅,你会惊讶地发现,如果用扩展中国剩余定理的话,我们只能求解出左项x的系数为1的式子。这对于身经百战的你当然不是问题,一下子就想到了将\(k_i\)化掉的好方法:

原式可化为:

\[k_ix + p_iy\equiv a_i
\]

用设\(g=gcd(k_i,p_i)\),那么用扩展欧几里得求出\(x'\)(一组解),原式可化为

\[x\equiv \frac{a_i}{g}x′(mod\frac {p_i}{g}​)
\]

然后我们就化成了系数为1的情况。我们就可以解辣♪(*)

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cctype>
#include<set>
#define int long long
using namespace std;
inline int read()
{
int x=0,w=0;char c=getchar();
while(!isdigit(c))w|=c=='-',c=getchar();
while(isdigit(c))x=(x<<3)+(x<<1)+(c^48),c=getchar();
return w?-x:x;
}
namespace star
{
const int maxn=1e5+100;
multiset<int >sword;
multiset<int >::iterator it;
int a[maxn],p[maxn],sw[maxn],n,m;
inline void init(){
memset(a,0,sizeof a);
memset(p,0,sizeof p);
memset(sw,0,sizeof sw);
sword.clear();
n=read(),m=read();
for(int i=1;i<=n;i++)a[i]=read();
for(int i=1;i<=n;i++)p[i]=read();
for(int i=1;i<=n;i++)sw[i]=read();
while(m--)sword.insert(read());
}
void exgcd(int a,int b,int& d,int &x,int &y){
if(!b)d=a,x=1,y=0;
else exgcd(b,a%b,d,y,x),y-=(a/b)*x;
}
inline int mul(int b,int k,int m){
int a=0;
for(;k;k>>=1,b=(b<<1)%m)
if(k&1)a=(a+b)%m;
return a;
}//龟速乘,防止溢出
inline int getsword(int i){
it=sword.upper_bound(a[i]);
if(it!=sword.begin())--it;
int zp=*it;
sword.erase(it);sword.insert(sw[i]);
return zp;
}
inline void excrt(){
int X,Y,k;
int m=1,ans=0,mx=0,G;
for(int i=1;i<=n;i++){
k=getsword(i);
mx=max(mx,(a[i]-1)/k+1);
k%=p[i];a[i]%=p[i];
if(!k&&a[i]){puts("-1");return;}//无解
if(!k&&!a[i])continue;//说明此同余方程没有作用,必须跳过
exgcd(k,p[i],G,X,Y);
if(a[i]%G){puts("-1");return;}
p[i]/=G;
a[i]=mul(a[i]/G,(X%p[i]+p[i])%p[i],p[i]);
exgcd(m,p[i],G,X,Y);
if((a[i]-ans)%G){puts("-1");return;}
m=m/G*p[i];
ans=(ans+mul(mul(m/p[i],((a[i]-ans)%m+m)%m,m),(X%m+m)%m,m))%m;
}
printf("%lld\n",ans>=mx?ans:ans+m*((mx-ans-1)/m+1));
}
inline void work(){
init();
excrt();
}
}
signed main()
{
int t=read();
while(t--)star::work();
return 0;
}

P4774-屠龙勇士-扩展中国剩余定理的更多相关文章

  1. LOJ 2721 「NOI2018」屠龙勇士——扩展中国剩余定理

    题目:https://loj.ac/problem/2721 1.注意别一输入 p[ i ] 就 a[ i ] %= p[ i ] ,因为在 multiset 里找的时候还需要真实值. 2.注意用 m ...

  2. NOI 2018 屠龙勇士 (拓展中国剩余定理excrt+拓展欧几里得exgcd)

    题目大意:略 真是一波三折的一道国赛题,先学了中国剩余定理,勉强看懂了模板然后写的这道题 把取出的宝剑攻击力设为T,可得Ti*x=ai(mod pi),这显然是ax=c(mod b)的形式 这部分用e ...

  3. [洛谷P4777] [模板] 扩展中国剩余定理

    扩展中国剩余定理,EXCRT. 题目传送门 重温一下中国剩余定理. 中国剩余定理常被用来解线性同余方程组: x≡a[1] (mod m[1]) x≡a[2] (mod m[2]) ...... x≡a ...

  4. 学习笔记 - 中国剩余定理&扩展中国剩余定理

    中国剩余定理&扩展中国剩余定理 NOIP考完回机房填坑 ◌ 中国剩余定理 处理一类相较扩展中国剩余定理更特殊的问题: 在这里要求 对于任意i,j(i≠j),gcd(mi,mj)=1 (就是互素 ...

  5. 2019牛客暑期多校训练营(第十场)Han Xin and His Troops——扩展中国剩余定理

    题意 求解 $n$ 个模方程 $x \equiv a (mod \ b)$,不保证模数互素($1 \leq n \leq 100$,$0 \leq b < a< 10^5$). 分析 套扩 ...

  6. poj2891 扩展中国剩余定理

    求a1x1+r1=y...anxn+rn=y,crt合并 //#pragma GCC optimize(2) //#pragma GCC optimize(3) //#pragma GCC optim ...

  7. 2019ICPC徐州网络赛 A.Who is better?——斐波那契博弈&&扩展中国剩余定理

    题意 有一堆石子,两个顶尖聪明的人玩游戏,先取者可以取走任意多个,但不能全取完,以后每人取的石子数不能超过上个人的两倍.石子的个数是通过模方程组给出的. 题目链接 分析 斐波那契博弈有结论:当且仅当石 ...

  8. Wannafly Camp 2020 Day 3I N门问题 - 概率论,扩展中国剩余定理

    有一个猜奖者和一个主持人,一共有 \(n\) 扇门,只有一扇门后面有奖,主持人事先知道哪扇门后有奖,而猜奖者不知道.每一轮,猜奖者选择它认为的有奖概率最大(如果有多个最大,随机选一个)的一扇门,主持人 ...

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

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

随机推荐

  1. Visual Studio 2022 Preview 1 和.NET 6 Preview 5 正式发布

    具有里程碑意义的Visual Studio 2022 Preview 1正式发布,重点是64位,而没有增加新功能,并且同时也发布了.NET 6 Preview 5. https://devblogs. ...

  2. FlinkSQL写入Kafka/ES/MySQL示例-JAVA

    一.背景说明 Flink的API做了4层的封装,上两层TableAPI.SQL语法相对简单便于编写,面对小需求可以快速上手解决,本文参考官网及部分线上教程编写source端.sink端代码,分别读取s ...

  3. 分分钟教你Python Web开发框架Django

    Python除了爬虫.深度学习(人工智能).数据分析等外,还可以用来开发网站系统,如我们常见的知乎,豆瓣等都是用Python开发的网站系统. 今天辰哥就来教大家如何新建属于自己的Django项目,让D ...

  4. 【linux】驱动-15-定时器

    目录 前言 15. 定时器 15.1 内核函数汇总 15.2 内核滴答 15.3 相关结构体 15.4 setup_timer() 设置定时器 15.5 add_timer() 向内核添加定时器 15 ...

  5. 安装redHat6.5详细图文教程

    ​ ​ 进入VM虚拟机,双击进入已经创建好的红帽6虚拟机 双击进入CD/DVD,准备添加红帽6.5的iso镜像文件 [红帽6.5的iso镜像文件需要先下载,redhat_6.5下载地址:https:/ ...

  6. 什么是Mirai僵尸网络

    1.什么是Mirai? Mirai是恶意软件,能够感染在ARC处理器上运行的智能设备,将其转变为远程控制的机器人或"僵尸"并组成网络.这种机器人网络称为僵尸网络,通常用于发动DDo ...

  7. 深入浅出,新一代跨平台抓包&调式利器Fiddler Everywhere

    什么是Fiddler Everywhere? Fiddler Everywhere is a web debugging proxy for macOS, Windows, and Linux. Ca ...

  8. Linux-Samba服务

    Samba服务 1.Samba的起源 对于windows的网上邻居来讲,共享文件的方式用的是SMB和CIFS协议以及NETBIOS协议Linux/Unix之间用的是NFS协议. 但是Linux和Win ...

  9. Netty 框架学习 —— UDP 广播

    UDP 广播 面向连接的传输(如 TCP)管理两个网络端点之间的连接的建立,在连接的生命周期的有序和可靠的消息传输,以及最后,连接的有序终止.相比之下,类似 UDP 的无连接协议中则没有持久化连接的概 ...

  10. 安卓手机改造服务器——解决chroot下无法使用systemctl

    在Linux Deploy中安装的CentOS7无法使用systemctl命令,没关系我们有其他办法 写在前面 对于这个问题,我也是第一次遇见.并没有深入研究,所有如果有哪些地方有问题,欢迎指正. 问 ...