P4774-屠龙勇士-扩展中国剩余定理
屠龙勇士
很久很久以前,巨龙突然出现,带来了灾难带走公主又消失不见。王国十分危险,世间谁最勇敢,一位英雄出现……
学习于该大佬博客
那么你就是这位英雄,不过不同的是,你面对的是一群巨龙,虽然巨龙都不会攻击;你每次使用的剑一打就爆,虽然每打死一条巨龙的奖励是一把新的剑;巨龙不会因为生命值降为负数而死亡,虽然巨龙会憨憨地回血然后把自己奶死;最重要的是你完成游戏不会获得公主的爱,只会获得参加ION8012的报名机会。你一听到最后一条彻底就失去了兴致,于是写了一个机器人帮你完成任务XD
简单来说,就是求解同余方程组:
\]
其中i为巨龙个数1-n。
然鹅,你会惊讶地发现,如果用扩展中国剩余定理的话,我们只能求解出左项x的系数为1的式子。这对于身经百战的你当然不是问题,一下子就想到了将\(k_i\)化掉的好方法:
原式可化为:
\]
用设\(g=gcd(k_i,p_i)\),那么用扩展欧几里得求出\(x'\)(一组解),原式可化为
\]
然后我们就化成了系数为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-屠龙勇士-扩展中国剩余定理的更多相关文章
- LOJ 2721 「NOI2018」屠龙勇士——扩展中国剩余定理
题目:https://loj.ac/problem/2721 1.注意别一输入 p[ i ] 就 a[ i ] %= p[ i ] ,因为在 multiset 里找的时候还需要真实值. 2.注意用 m ...
- NOI 2018 屠龙勇士 (拓展中国剩余定理excrt+拓展欧几里得exgcd)
题目大意:略 真是一波三折的一道国赛题,先学了中国剩余定理,勉强看懂了模板然后写的这道题 把取出的宝剑攻击力设为T,可得Ti*x=ai(mod pi),这显然是ax=c(mod b)的形式 这部分用e ...
- [洛谷P4777] [模板] 扩展中国剩余定理
扩展中国剩余定理,EXCRT. 题目传送门 重温一下中国剩余定理. 中国剩余定理常被用来解线性同余方程组: x≡a[1] (mod m[1]) x≡a[2] (mod m[2]) ...... x≡a ...
- 学习笔记 - 中国剩余定理&扩展中国剩余定理
中国剩余定理&扩展中国剩余定理 NOIP考完回机房填坑 ◌ 中国剩余定理 处理一类相较扩展中国剩余定理更特殊的问题: 在这里要求 对于任意i,j(i≠j),gcd(mi,mj)=1 (就是互素 ...
- 2019牛客暑期多校训练营(第十场)Han Xin and His Troops——扩展中国剩余定理
题意 求解 $n$ 个模方程 $x \equiv a (mod \ b)$,不保证模数互素($1 \leq n \leq 100$,$0 \leq b < a< 10^5$). 分析 套扩 ...
- poj2891 扩展中国剩余定理
求a1x1+r1=y...anxn+rn=y,crt合并 //#pragma GCC optimize(2) //#pragma GCC optimize(3) //#pragma GCC optim ...
- 2019ICPC徐州网络赛 A.Who is better?——斐波那契博弈&&扩展中国剩余定理
题意 有一堆石子,两个顶尖聪明的人玩游戏,先取者可以取走任意多个,但不能全取完,以后每人取的石子数不能超过上个人的两倍.石子的个数是通过模方程组给出的. 题目链接 分析 斐波那契博弈有结论:当且仅当石 ...
- Wannafly Camp 2020 Day 3I N门问题 - 概率论,扩展中国剩余定理
有一个猜奖者和一个主持人,一共有 \(n\) 扇门,只有一扇门后面有奖,主持人事先知道哪扇门后有奖,而猜奖者不知道.每一轮,猜奖者选择它认为的有奖概率最大(如果有多个最大,随机选一个)的一扇门,主持人 ...
- (伪)再扩展中国剩余定理(洛谷P4774 [NOI2018]屠龙勇士)(中国剩余定理,扩展欧几里德,multiset)
前言 我们熟知的中国剩余定理,在使用条件上其实是很苛刻的,要求模线性方程组\(x\equiv c(\mod m)\)的模数两两互质. 于是就有了扩展中国剩余定理,其实现方法大概是通过扩展欧几里德把两个 ...
随机推荐
- python_xlutils : python利用xlutils修改表格内容
一.xlutils是什么 是一个提供了许多操作修改excel文件方法的库: 属于python的第三方模块 xlrd库用于读取excel文件中的数据,xlwt库用于将数据写入excel文件,修改用xlu ...
- Springboot-Redis分布式锁 -----StringRedisTemplate
这里引用别人, 用来自己回忆 https://blog.csdn.net/jack_shuai/article/details/91986690 https://www.cnblogs.com/mox ...
- 尚硅谷Java——宋红康笔记【day19-day24】
day19 测试Thread中的常用方法: start():启动当前线程:调用当前线程的run() run(): 通常需要重写Thread类中的此方法,将创建的线程要执行的操作声明在此方法中 curr ...
- ThreadLocal源码阅读笔记
功能描述 ThreadLocal解决了访问共享变量的阻塞问题,并且不需要像CAS操作一样牺牲CPU资源,它为每一个线程维护了一个变量副本,每个线程在访问ThrealLocal里面的变量时实际上访问的是 ...
- nacos 集群搭建
nacos 集群搭建 1.单机部署 从nacos官网下载zip/tar包,https://github.com/alibaba/nacos/releases/tag/2.0.2 解压后即可启动 外置数 ...
- Spring Boot动态权限变更实现的整体方案
1.前言 在Web项目中,权限管理即权限访问控制为网站访问安全提供了保障,并且很多项目使用了Session作为缓存,结合AOP技术进行token认证和权限控制.权限控制流程大致如下图所示: 现 ...
- 对标 Spring Boot & Cloud ,轻量框架 Solon 1.5.8 发布
Solon 是一个轻量的Java基础开发框架.强调,克制 + 简洁 + 开放的原则:力求,更小.更快.更自由的体验.支持:RPC.REST API.MVC.Job.Micro service.WebS ...
- .net core mysql entity映射时字符串被截断
参考地址:https://stackoverflow.com/questions/40833262/net-core-entity-framework-mysql-string-fields-stor ...
- 《汇编语言程序设计》(Professional Assembly Language)学习笔记(二)
挖坑:学习笔记(一)讲述如何在 Windows Vmware 上安装 Ubuntu 20.04 实践环境 本文是基于Ubuntu 20.04平台进行实验,下文中的解决方法都基于此前提 问题记录 问题一 ...
- webpack(3)基础的打包过程
没有配置文件的打包 如果我们没有使用配置文件webpack.config.js,那么我们就需要通过命令来打包 案例 我们首先创建一个webpackTest文件夹,然后在文件夹中再创建2个子文件夹dis ...