题目:https://loj.ac/problem/2721

1.注意别一输入 p[ i ] 就 a[ i ] %= p[ i ] ,因为在 multiset 里找的时候还需要真实值。

2.注意用 multiset 。并且,因为要 upper_bound( a[ i ] ) ,而 a[ i ] 是一个 long long 类型的,所以即使 multiset 里装的都是 int 类型的,也得开成 long long 的 multiset 。

3.注意除了同余的限制,还有一个是 \( x*c_i >= a_i \) (\(c_i\)就是对应剑的攻击力);只需要在最后用所有 p 的 lcm 调整一下即可。

4.注意要用大数乘法……再各种地方都要注意是否可以直接乘。

别写错扩展 CRT ,特别是 x 乘上 r/g 那个部分。

不太明白为了最后的 x 是最小正整数,是否需要让中间过程中的每个 x 都是最小正整数。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<set>
#define ll long long
using namespace std;
ll rdn()
{ll ret=0;bool fx=1;char ch=getchar();while(ch>'9'||ch<'0'){if(ch=='-')fx=0;ch=getchar();}while(ch>='0'&&ch<='9')ret=ret*10+ch-'0',ch=getchar();return fx?ret:-ret;
}
ll Mx(ll a,ll b){return a>b?a:b;}
const int N=1e5+5;
int n,m,atk[N]; ll a[N],p[N],lm; bool fg;
struct Node{ll a,p;Node(ll a=0,ll p=0):a(a),p(p) {}
};
multiset<ll> st;//multiset not set!!!!!!
ll Mul(ll a,ll b,ll mod)
{ll d=(ll)floor((double)a*b/mod+0.5);ll ret=a*b-d*mod; if(ret<0)ret+=mod; return ret;
}
ll exgcd(ll a,ll b,ll &x,ll &y)
{if(!b){x=1;y=0;return a;}ll ret=exgcd(b,a%b,y,x); y-=a/b*x; return ret;
}
void init()
{for(int i=1;i<=n;i++)a[i]=rdn();for(int i=1;i<=n;i++)p[i]=rdn()/*,a[i]%=p[i]*/;//for setfor(int i=1;i<=n;i++)atk[i]=rdn();st.clear(); lm=0;/for(int i=1,d;i<=m;i++)d=rdn(),st.insert(d);multiset<ll>::iterator it,it2;ll d,x,y;for(int i=1;i<=n;i++){it=st.upper_bound(a[i]);///for here <ll> not <int>if(it!=st.begin())it--;d=(*it); st.erase(it); st.insert(atk[i]);ll g=exgcd(d,p[i],x,y);a[i]/=g; p[i]/=g; d/=g;///
      lm=Mx(lm,(ll)ceil((double)a[i]/d));//
      a[i]=Mul(a[i],x,p[i]);///
    }
}
Node cal(Node u,Node v)
{ll a=u.p, b=v.p, r=v.a-u.a, x,y;ll g=exgcd(a,b,x,y);if(r%g){ fg=1;return Node(0,0);}a/=g; b/=g; r/=g;x=Mul(x,r,b);///y=a*b*g; x=(u.a+Mul(x,u.p,y))%y;return Node(x,y);
}
int main()
{freopen("dragon.in","r",stdin);freopen("dragon.out","w",stdout);int T=rdn();while(T--){n=rdn();m=rdn(); fg=0; init();if(fg){puts("-1");continue;}Node cr=Node(a[1],p[1]);if(fg){puts("-1");continue;}for(int i=2;i<=n;i++){cr=cal(cr,Node(a[i],p[i]));if(fg){ puts("-1");break;}}if(fg)continue;if(cr.a<lm){ll k=ceil((double)(lm-cr.a)/cr.p);cr.a+=k*cr.p;}if(!fg)printf("%lld\n",cr.a);}return 0;
}

转载于:https://www.cnblogs.com/Narh/p/10956882.html

LOJ 2721 「NOI2018」屠龙勇士——扩展中国剩余定理相关推荐

  1. 数论一之定理证明——裴蜀/威尔逊/费马/扩展欧几里得/[扩展]欧拉/[扩展]中国剩余定理,欧拉函数,逆元,剩余系,筛法

    打死没想到会在H老师处学懂数论 同余,整除 模运算 埃式筛法 欧拉筛法 最大公约数和最小公倍数 辗转相除法 更相减损术 裴蜀定理 威尔逊定理 费马定理 同余等价类.剩余系.缩系 欧拉函数 欧拉定理 扩 ...

  2. 中国剩余定理与扩展中国剩余定理

    中国剩余定理又名孙子定理 用来求解同余线性方程组 其中m1,m2,m3-两两互质,求x的最小整数解: 设M为m1,m2,m3-的公倍数. 根据上面的推导,为什么x的通解形式是累加呢? 根据上面推导,推 ...

  3. 中国剩余定理及扩展中国剩余定理

    目录 中国剩余定理CRT 扩展中国剩余定理ExCRT TJOI2009 猜数字 HDU 1573 X问题 中国剩余定理CRT 中国剩余定理是用来求线性同于方程组的. \[ \begin{aligned ...

  4. 博客处女作:中国剩余定理与扩展中国剩余定理

    各位好啊,这里是蒟蒻gigo_64的第一篇博客,,这里我们开始啦. 本文需要读者知晓扩展欧几里得,如果不会请点击这个大佬的链接;https://blog.csdn.net/sslz_fsy/artic ...

  5. 与数论的厮守04:扩展中国剩余定理

    根据数论的尿性,一般的定理解决不了的问题怎么办?那就拓展一下呗. 我们先看中国剩余定理,它解决的是一堆同余方程:nΞa1(mod b1),nΞa2(mod b2)...nΞak(mod bk),其中b ...

  6. 数论-扩展中国剩余定理

    求解 n 个同余方程 x ≡ Ci (mod Mi) 推荐一下讲证明的文章: 1.https://www.cnblogs.com/TheRoadToTheGold/p/8458326.html 很简洁 ...

  7. loj 2718. 「NOI2018」归程

    题意: 给一个图,每次询问从某个点出发,先坐车经过一些权值大于pp<script type="math/tex" id="MathJax-Element-31&qu ...

  8. 中国剩余定理以及扩展中国剩余定理

    中国剩余定理必须有两两互质的条件:而扩展中国剩余定理没有限制(可能互质,也能不互质).所以只记忆一个扩展中国剩余定理的板子就行. 代码 #include <iostream> #inclu ...

  9. 中国剩余定理和扩展中国剩余定理

    也许更好的阅读体验 文章目录 前置知识 中国剩余定理(CRT) 目的 求法 Code 扩展中国剩余定理(EXCRT) 目的 解法 code 前置知识 快速乘 扩展欧几里得定理 同余方程 中国剩余定理( ...

最新文章

  1. 史上最全!图解浏览器的工作原理
  2. 计算机高校应用现状的参考文献,【计算机应用论文】高校计算机实验室管理思考探索(共4094字)...
  3. node.js下载安装并配置WebStrom
  4. Codeforce 1182B Plus from Picture
  5. UI 07 _ 导航视图控制器 与 属性传值
  6. Linux 网页交互、curl
  7. 易语言PHP自动更新,易语言自动更新源码
  8. 如何使用AForge调用本机摄像头
  9. 高淇python400集课堂笔记_2020六年级上第十七课《古诗三首》手抄笔记及图文讲解...
  10. 深入分析Zookeeper的Leader选举原理
  11. 使用OpenSSL模拟SSL证书验证过程
  12. 证明:1/n调和级数为何是发散的
  13. 使用Docker搭建ceph群集(nautilus版本)
  14. IBM DB2基础知识学习作业
  15. flask上传图片以及生成缩略图
  16. 动图设置动图设置动图设置
  17. 性能诊断定位之内存问题排查(一):监控年轻代、年老代、元数据空间变化情况
  18. 招聘行业还有机会吗?
  19. 数据结构与算法之插入排序(含改进版)
  20. 剖析Android的Smart Lock

热门文章

  1. sql常用语句使用方法
  2. 混合式APP开发中中间件方案Rexsee
  3. [ZZ]Map/Reduce hadoop 细节
  4. 替换不文明词语和非法字符
  5. 初创公司面试要问什么_聘请初创公司的产品设计师时要问的问题
  6. JavaScript库和API
  7. IDEA IntelliJ 如何快速查看一个类里面包含哪些方法
  8. java mvc view_对Springmvc view层的理解
  9. 哪些人适合参加软件测试培训
  10. 64 安装_解决“不能安装 64 位Office,因已安装 32 位 Office 产品”问题