1407: [Noi2002]Savage
2024-08-21 06:56:48
其实答案远不到1e6
所以可以枚举!
设答案是m
那\(i,j\)的相遇就可以表示成\(P_ix+C_i=P_jx+C_j+ym\)
移向就是\((P_i-P_j)x-ym=C_j-C_i\)
套扩展欧几里得定理
如果\(C_j-C_i\mod gcd\ !=0\)说明不会相遇
否则的话求一下第一次相遇时间,如果大于一个的寿命也不会相遇
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define M 1000010
using namespace std;
int n,m,k,c[M],l[M],p[M],maxx,x,y;
int exgcd(int a,int b,int &x,int &y)
{
if(!b) {x=1, y=0; return a;}
int tmp=exgcd(b,a%b,y,x);
y-=a/b*x; return tmp;
}
bool check(int k)
{
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
{
int a=p[i]-p[j], b=c[j]-c[i];
if(a<0) a=-a, b=-b;
int g=exgcd(a,k,x,y);
if(b%g) continue;
x*=b/g; int f=k/g;
x=(x%f+f)%f; if(!x) x=f;
if(x<=min(l[i],l[j])) return 0;
}
return 1;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d%d%d",&c[i],&p[i],&l[i]), m=max(m,c[i]);
for(;;m++) if(check(m)) break;
printf("%d",m);
}
最新文章
- 怎样才能自学好Java?
- npm更新到最新版本的方法
- 每天一个linux命令(45):free 命令
- 关于中文字体的设置说明(font:12px/1.5 tahoma,arial,\5b8b\4f53)
- RSA算法基础详解
- TCP/IP协议学习(四) 协议概述
- 在表单(input)中id和name的区别
- [Everyday Mathematics]20150210
- 【mysql的编程专题⑥】视图
- LintCode 55 比较字符串
- sparklyr包:实现Spark与R的接口
- selenium,html高宽设置成了0,会影响元素可见性,怎么手动修改某个元素的高宽?
- 算法题:A除以B
- 带你深入理解STL之Stack和Queue
- 《HelloGitHub》第 32 期
- 9、vuex快速上手
- Java_Mybatis_注解代理写法
- Linux系统下yum源配置(Centos 6)
- mongodb oplog与数据同步
- 14 printf输出格式及栈空间分配