博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[2018.12.13]BZOJ1407 [Noi2002]Savage
阅读量:6075 次
发布时间:2019-06-20

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

考虑枚举山洞数量,问题变为判断一定数量的山洞是否合法。

设山洞数量为\(k\),即使得对于任意\(i,j\),满足

\(C_i+P_ix\equiv C_j+P_jx(mod\ k)\)

的最小正整数解(即两者相遇的最小天数)不存在或大于\(min(L_i,L_j)\)

化简方程

\(C_i+P_ix\equiv C_j+P_jx(mod\ k)\)

\((P_i-P_j)x\equiv P_j-P_i(mod\ k)\)

\((P_i-P_j)x+ky\equiv P_j-P_i\)

扩展欧几里得求解即可。

(注:需要将\(P_i-P_j\)变为不影响答案的正整数,即\(((P_i-P_j)mod\ k+k)mod\ k\))

code:

#include
using namespace std;int n,c[20],p[20],l[20],mnn,sv,mnv,tmp;int exgcd(int a,int b,int &solx,int &soly){//a*solx+b*soly=sv if(!b){ if(sv%a)return 0; solx=sv/a; soly=0; return a; } int sx,sy,t=exgcd(b,a%b,sx,sy); if(t){ solx=sy; soly=sx-(a/b)*sy; return t; }else return 0;}bool Solve(int d){ for(int i=1;i<=n;i++){ for(int j=i+1;j<=n;j++){ sv=c[j]-c[i]; int t=exgcd(((p[i]-p[j])%d+d)%d,d,mnv,tmp); if(!t)continue; int mod=d/t; mnv=(mnv%mod+mod)%mod; if(!mnv)mnv+=mod; if(mnv<=min(l[i],l[j]))return false; } } return true;}int main(){ scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%d%d%d",&c[i],&p[i],&l[i]),mnn=max(mnn,c[i]); for(int i=mnn;i<=1000000;i++)if(Solve(i))return printf("%d",i),0; return 0;}

转载于:https://www.cnblogs.com/xryjr233/p/BZOJ1407.html

你可能感兴趣的文章
sharepoint2013中文版新体验—office web app 2013不允许与sharepint2013安装在同一台服务器上(2)...
查看>>
hrbeu 哈工程 Eular Graph
查看>>
隐马尔可夫模型(二)——隐马尔可夫模型的构成
查看>>
【OpenCV学习】安防监控可疑走动报警
查看>>
DotNetBar 10.9.0.4 原版(DotNetBar For Windows Forms 10)控件收集
查看>>
maven archetype:generate 的进一步理解
查看>>
用C++实现一个不能被继承的类
查看>>
使用CSS3技术增强你的文字排版
查看>>
LinearLayout(线性布局)
查看>>
Linux 下编译、安装、配置 QT
查看>>
数据结构中常见的树(BST二叉搜索树、AVL平衡二叉树、RBT红黑树、B-树、B+树、B*树)...
查看>>
daemon进程
查看>>
选择合适的项目-任务管理工具Jira Redmine Trac对比
查看>>
Android之更新ListView,位置置顶的问题
查看>>
ios公司开发者账号申请分享攻略(转自yiwind0101)
查看>>
Javascript如何判断对象是否相等
查看>>
转:java访问权限修饰符public protected friendly private用法总结
查看>>
Semaphore的应用
查看>>
《Android深度探索(卷1):HAL与驱动开发》虚拟实验环境(Ubuntu Linux)免费下载,不需要CPU虚拟化支持...
查看>>
std::find ,set.find, multiset.find, map.find和multimap.find算法总结
查看>>