「NOI2018」屠龙勇士(EXCRT)

终于把传说中 \(NOI2018D2\) 的签到题写掉了。。。

开始我还没读懂题目。。。而且这题细节巨麻烦。。。(可能对我而言)

首先我们要转换一下,每次的 \(atk[i]\) 都可以用 \(multiset\) 找。

我们发现题目求的是 \(atk*x\equiv a_i(\text{mod}\ p_i)\),所以我们做一遍 \(exgcd\),求出同余方程。

然后就可以愉快的 \(EXCRT\) 了~

不过发现一次要把龙的血量清零,所以一定要减到负数。我们在求 \(atk[i]\) 的时候顺便求一下最大值就行了。

当然,中间无论什么时候无解都输出 \(-1\)

\(Code\ Below:\)

  1. #include <bits/stdc++.h>
  2. #define ll long long
  3. using namespace std;
  4. const int maxn=100000+10;
  5. int n,m,flag;ll a[maxn],p[maxn],b[maxn],c[maxn],A[maxn],B[maxn],Max;
  6. multiset<ll> s;
  7. multiset<ll>::iterator it;
  8. void exgcd(ll a,ll b,ll &g,ll &x,ll &y){
  9. if(b==0){
  10. g=a;x=1;y=0;
  11. return;
  12. }
  13. exgcd(b,a%b,g,y,x);
  14. y-=(a/b)*x;
  15. }
  16. inline ll mul(ll a,ll b,ll mod){
  17. ll ret=0;b=(b%mod+mod)%mod;
  18. for(;b;b>>=1,a=(a+a)%mod)
  19. if(b&1) ret=(ret+a)%mod;
  20. return ret;
  21. }
  22. inline void merge(ll &a1,ll &b1,ll a2,ll b2){
  23. ll d=a2-a1,g,x,y;
  24. exgcd(b1,b2,g,x,y);
  25. if(d%g==0){
  26. x=(mul(x,d/g,b2/g)+(b2/g))%(b2/g);
  27. a1=x*b1+a1;b1=b1/g*b2;
  28. }
  29. else flag=1;
  30. }
  31. inline ll excrt(ll *a,ll *b){
  32. ll a1,b1,a2,b2;
  33. a1=a[1];b1=b[1];
  34. for(int i=2;i<=n;i++){
  35. a2=a[i];b2=b[i];
  36. merge(a1,b1,a2,b2);
  37. if(flag) return -1;
  38. }
  39. if(a1>=Max) return a1;
  40. return a1+((Max-a1)/b1+((Max-a1)%b1?1:0))*b1;
  41. }
  42. int main()
  43. {
  44. int T;
  45. scanf("%d",&T);
  46. while(T--){
  47. scanf("%d%d",&n,&m);flag=Max=0;s.clear();
  48. ll d,g,x,y;
  49. for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
  50. for(int i=1;i<=n;i++) scanf("%lld",&p[i]);
  51. for(int i=1;i<=n;i++) scanf("%lld",&b[i]);
  52. for(int i=1;i<=m;i++){
  53. scanf("%lld",&x);
  54. s.insert(x);
  55. }
  56. for(int i=1;i<=n;i++){
  57. it=s.upper_bound(a[i]);
  58. if(it!=s.begin()) it--;
  59. c[i]=*it;s.erase(s.find(*it));s.insert(b[i]);
  60. Max=max(Max,a[i]/c[i]+(a[i]%c[i]?1:0));
  61. }
  62. //atk * x = a_1 (mod p_1)
  63. for(int i=1;i<=n;i++){
  64. d=a[i];exgcd(c[i],p[i],g,x,y);
  65. if(d%g){flag=1;break;}
  66. x=(mul(x,d/g,p[i]/g)+(p[i]/g))%(p[i]/g);
  67. A[i]=x;B[i]=p[i]/g;
  68. }
  69. if(flag) printf("-1\n");
  70. else printf("%lld\n",excrt(A,B));
  71. }
  72. return 0;
  73. }

「NOI2018」屠龙勇士(EXCRT)的更多相关文章

  1. 「NOI2018」屠龙勇士

    「NOI2018」屠龙勇士 题目描述 小\(D\)最近在网上发现了一款小游戏.游戏的规则如下: 游戏的目标是按照编号\(1-n\)顺序杀掉\(n\) 条巨龙,每条巨龙拥有一个初始的生命 值ai .同时 ...

  2. POJ1061 青蛙的约会 和 LOJ2721 「NOI2018」屠龙勇士

    青蛙的约会 Language:Default 青蛙的约会 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 133470 Accep ...

  3. 「NOI2018」屠龙勇士 解题报告

    「NOI2018」屠龙勇士 首先对于每个龙用哪个剑砍,我们可以用set随便模拟一下得到. 然后求出拿这个剑砍这条龙的答案 \[ atk_ix-p_iy=a_i \] 其中\(atk_i\)是砍第\(i ...

  4. LOJ #2721. 「NOI2018」屠龙勇士(set + exgcd)

    题意 LOJ #2721. 「NOI2018」屠龙勇士 题解 首先假设每条龙都可以打死,每次拿到的剑攻击力为 \(ATK\) . 这个需要支持每次插入一个数,查找比一个 \(\le\) 数最大的数(或 ...

  5. loj#2721. 「NOI2018」屠龙勇士

    题目链接 loj#2721. 「NOI2018」屠龙勇士 题解 首先可以列出线性方程组 方程组转化为在模p意义下的同余方程 因为不保证pp 互素,考虑扩展中国剩余定理合并 方程组是带系数的,我们要做的 ...

  6. 「NOI2018」屠龙勇士(CRT)

    /* 首先杀每条龙用到的刀是能够确定的, 然后我们便得到了许多形如 ai - x * atki | pi的方程 而且限制了x的最小值 那么exgcd解出来就好了 之后就是扩展crt合并了 因为全T调了 ...

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

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

  8. 「NOI2018」你的名字

    「NOI2018」你的名字 题目描述 小A 被选为了\(ION2018\) 的出题人,他精心准备了一道质量十分高的题目,且已经 把除了题目命名以外的工作都做好了. 由于\(ION\) 已经举办了很多届 ...

  9. loj#2718. 「NOI2018」归程

    题目链接 loj#2718. 「NOI2018」归程 题解 按照高度做克鲁斯卡尔重构树 那么对于询问倍增找到当前点能到达的高度最小可行点,该点的子树就是能到达的联通快,维护子树中到1节点的最短距离 s ...

随机推荐

  1. threading 多线程类继承方式调用

    import threading #线程import time class Work(threading.Thread): def __init__(self,n): threading.Thread ...

  2. Hibernate 再接触 事务隔离机制

    事务:要么都要完成,一个不完成就要回滚. ACID 原子性 一致性 独立性 持久性 第一类丢失更新 第一类丢失更新 脏读(读了另外一个事务没有提交的数据) 不可重复读(在同一个事务里,对数据库里的值前 ...

  3. Mesh属性[Unity]

    Mesh属性[Unity] Mesh是Unity内的一个组件,称为网格组件.3D网格是Unity中最重要的图形元素.在Unity中存在多种组件用于渲染标准网格或者蒙皮网格.拖尾或者3D线条. 在Uni ...

  4. python中发送post请求时,报错“Unrecognized token 'xxxx': was expecting ('true', 'false' or 'null')”

    解决办法: 如请求参数为 data={“user”=“aaa”,“pwd”=“123456”,sign=“00000000000000”} 需要将参数data先做处理,调用函数datas=datajs ...

  5. 常用curl命令

    curl -F "userfile=@/Users/username/Downloads/20170502.zip" http://youip/up.php curl -X POS ...

  6. 在windows下安装Git并用GitHub同步

    准备环境: 1,注册github账户 2,下载安装git(下载地址:https://git-scm.com/download/win) 注释: git是什么? git是版本管理工具,当然也是分布式的管 ...

  7. 微信H5支付 遇到坑的一些解决方法

    解决办法 1. 商家参数格式有误,请联系商家解决 a.对于前后端分离的开发模式 前端发起请求 服务端请求微信h5支付统一下单接口 返回参数mweb_url 给前端 然后前端调起微信h5支付 b.注意的 ...

  8. AltiumDesigner PCB导入CAD

    点击File菜单下的New的PCB,新建PCB文件. 在AD09中点击File菜单下的Import,导入CAD文件 选择要导入的CAD文件,点击打开. 选择单位mm,这里的单位选择要与CAD单位一致, ...

  9. pythonj基础(五)元组和集合

    一,什么是元祖 Python的元组与列表类似,不同之处在于元组的元素不能修改. 元组使用小括号,列表使用方括号. 元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可. 1.创建一个空元组 tu ...

  10. kafka可视化客户端工具(Kafka Tool)的基本使用

    1.下载 下载地址:http://www.kafkatool.com/download.html 2.安装 根据不同的系统下载对应的版本,我这里kafka版本是1.1.0,下载kafka tool 2 ...