博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【题解】洛谷P2421[NOI2002]荒岛野人 (Exgcd)
阅读量:4663 次
发布时间:2019-06-09

本文共 1469 字,大约阅读时间需要 4 分钟。

洛谷P2421:https://www.luogu.org/problemnew/show/P2421

思路

从洞的最大编号开始增大枚举答案

对于每一个枚举的ans要满足Ci+k*Pi≡Cj+k*Pj(mod ans)k ,都要k>min(L[i],L[j]

因为这个ans一定要满足在一个野人死之前可以满足条件

根据上式可以推出Ci+k*Pi=Cj+k*Pj+m*ans   移项得k*(Pi-Pj)+m*ans=Cj-Ci

即可用Exgcd求解此式子

代码

#include
#include
#include
using namespace std;#define maxn 20int n,Max;int C[maxn],P[maxn],L[maxn];int gcd(int a,int b){ if(!b) return a; else return gcd(b,a%b);}void exgcd(int a,int b,int &x,int &y){ if(!b) { x=1; y=0; } else { exgcd(b,a%b,x,y); int t=x; x=y; y=t-a/b*y; }}bool check(int ans){ for(int i=1;i<=n;i++) { for(int j=i+1;j<=n;j++)//枚举所有的野人 { int a=P[i]-P[j],c=C[j]-C[i],b=ans,d=gcd(a,b),x=0,y=0; if(c%d==0)//运用Exgcd求解 { a=a/d,b=b/d,c=c/d; exgcd(a,b,x,y); b=abs(b); x=((x*c)%b+b)%b; if(!x) x+=b; if(x<=min(L[i],L[j])) return false;//满足一个野人已死亡 } } } return true;}int main(){ scanf("%d",&n); for(int i=1;i<=n;i++) { cin>>C[i]>>P[i]>>L[i]; Max=max(Max,C[i]);//求出洞的最大编号 } for(int i=Max;;i++)//ans至少要大于最大编号 { if(check(i))//如果满足条件 { cout<
View Code

 

转载于:https://www.cnblogs.com/BrokenString/p/9671291.html

你可能感兴趣的文章
Visual Studio 2017离线安装包,百度云分流
查看>>
【SAS BASE】SAS格式、缺失值表示、命名规则及路径
查看>>
杭电2096
查看>>
程序员不得不知的座右铭(中国篇)
查看>>
中国大学MOOC-数据结构基础习题集、06-4、How Long Does It Take
查看>>
第四章 串的基本操作【数据结构】
查看>>
嵌入式系统
查看>>
web前端面试题
查看>>
冲刺第十九天
查看>>
POJ 2376 Cleaning Shifts
查看>>
HDU 5596 ——GTW likes gt——————【想法题】
查看>>
python多线程不断刷新网页的源码
查看>>
MySQL5.7配置GTID主从---搭建GTID主从
查看>>
《嵌入式程序设计》第X周学习总结模板
查看>>
AC日记——求10000以内n的阶乘 openjudge 1.6 14
查看>>
New Post
查看>>
如何调用common.js
查看>>
android ListView 滑动时变黑解决方法
查看>>
最后一次作业-- 总结报告
查看>>
CAS 4.0.0RC 配置通过数据库认证用户登录
查看>>