博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[ NOI 2002 ] 荒岛野人
阅读量:5076 次
发布时间:2019-06-12

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

\(\\\)


5be15b4151e9d.png

  • \(n\le 15\),保证答案小于 \(10^6\)

\(\\\)

Solution


首先要注意到答案不具有单调性,手搓两组样例就能发现剩余系不同重合位置是不同的。

然后想到从小往大枚举答案然后验证。注意下界是 \(max\{C_i\}\)

验证选择最暴力的方法即可。

加入现在枚举共有 \(len\) 个洞。

考虑两个野人 \(i,j\) ,假如说 \(k\) 年后他们重合,那么 \(k\) 应该满足

\[ C_i+kP_i\equiv C_j+kP_j\pmod{len} \]
移项
\[ k(P_i-P_j)\equiv C_j-C_i\pmod{len} \]
这不是同余方程么.....直接扩欧求一个最小的正整数解 \(k\) 即可。

如果 \(k>min(L_i,L_j)\) 证明在相遇之前他们之中就有人死了,所以没有问题。

特殊的,如果无解代表他们这辈子也碰不到,也是合法的。

复杂度 \(O(ans\times 15^2\times log 10^6)\)

\(\\\)

Code


#include
#include
#include
#include
#include
#include
#include
#define N 20#define R register#define gc getcharusing namespace std;inline int rd(){ int x=0; bool f=0; char c=gc(); while(!isdigit(c)){if(c=='-')f=1;c=gc();} while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=gc();} return f?-x:x;}int n,mx,c[N],p[N],l[N];void exgcd(int a,int b,int &x,int &y,int &g){ if(!b){g=a;x=1;y=0;} else{exgcd(b,a%b,y,x,g);y-=a/b*x;}}inline bool valid(int now){ R int a,b,d,x,y,g; for(R int i=1;i

转载于:https://www.cnblogs.com/SGCollin/p/9916559.html

你可能感兴趣的文章
jekins自动部署tomcat注意事项、连接tomcat报错
查看>>
Android--ViewPager的无限轮播
查看>>
使用jdbc给一张表增加多行字段
查看>>
My97DatePicker时间控件使用
查看>>
如何给Runnable线程传递参数?
查看>>
sql2008无法远程连接问题设置
查看>>
Python 自动补全(vim)
查看>>
封装 DBDA 类 StrQuery 、JSONQuery
查看>>
ADO.NET(一)
查看>>
[ruby on rails] 深入(1) ROR的一次request的响应过程
查看>>
最小生成树-Prim算法和Kruskal算法
查看>>
ScriptedSandbox64.exe 在写Winform程序Debug时不停提交数据
查看>>
js一些跳转网页以及自动弹出广告
查看>>
VMware-CnetOs--lamp环境
查看>>
SQL Server无法启动,错误代码 3417(太久没用,目录被压缩了)
查看>>
bzoj1854: [Scoi2010]游戏(匈牙利) / GDKOI Day2 T2(最大流)
查看>>
bzoj1968: [Ahoi2005]COMMON 约数研究(数论)
查看>>
数据库面熟题,转载自http://blog.itpub.net/23451429/
查看>>
IDEA Spark Streaming Kafka数据源-Consumer
查看>>
Python--列表操作
查看>>