JZYZOJ1372 [noi2002]荒岛野人 扩展欧几里得
Posted 鲸头鹳
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JZYZOJ1372 [noi2002]荒岛野人 扩展欧几里得相关的知识,希望对你有一定的参考价值。
http://172.20.6.3/Problem_Show.asp?id=1372
想法其实很好想,但是我扩展欧几里得还是用得不熟练,几乎是硬套模板,大概因为今天一个下午状态都不大好。
扩展欧几里得算法计算的是 : ab互质时ax+by=1或ab不互质时ax+by=gcd(a,b)(废话)的一个整数解,可以据此推导一个方程是否有解。
然后我理解这个基本概念理解了一个下午,非常智障了。
这道题也是模板,两两对比即可。
代码
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath> 6 using namespace std; 7 const int maxn=100010; 8 long long n,p[20]={},l[20]={},c[20]={}; 9 int exgcd(int a,int b,long long &x,long long &y){ 10 if(!b){ 11 x=1;y=0; 12 return a; 13 } 14 int d=exgcd(b,a%b,x,y); 15 long long w=x;x=y; 16 y=w-y*(a/b); 17 return d; 18 } 19 int main(){ 20 scanf("%d",&n);long long a,b,m,d,x,y,now=n; 21 for(int i=1;i<=n;i++){ 22 scanf("%I64d%I64d%I64d",&c[i],&p[i],&l[i]); 23 now=max(now,c[i]); 24 } 25 for(int k=now;;k++){ 26 int f=0; 27 for(int i=1;i<=n;i++){ 28 for(int j=i+1;j<=n;j++){ 29 a=p[i]-p[j];b=k;m=c[j]-c[i]; 30 d=exgcd(a,b,x,y); 31 if(m%d)continue; 32 b/=d;m/=d;x=x*m;x%=b; 33 if(x<0)x+=abs(b); 34 if(x<=min(l[i],l[j])){f=1;break;} 35 } 36 if(f)break; 37 } 38 if(!f){ 39 printf("%d\n",k); 40 break; 41 } 42 } 43 return 0; 44 }
以上是关于JZYZOJ1372 [noi2002]荒岛野人 扩展欧几里得的主要内容,如果未能解决你的问题,请参考以下文章