zoukankan      html  css  js  c++  java
  • 洛谷P2421

    洛谷P2421
    这一道题目是一道同余的题目,进行推理后用扩展欧几里得就可以了,解析我写在了代码里面

    #include<bits/stdc++.h>
    #define Int64 long long
    #define maxn 17
    using namespace std;
    Int64 c[maxn],p[maxn],l[maxn];
    //出生地,速度,生命长度 
    int Extend_gcd(Int64 a,Int64 b,int &x,int &y){
    	//ax+by=gcd(a,b);
    	if(!b){
    		x=1;y=0;
    		return a;
    	}
    	int d=Extend_gcd(b,a%b,x,y);
    	int tmp=x;
    	x=y;y=tmp-a/b*y;
    	return d;
    }
    int n;
    bool check(int pos){
    	for(int i=1;i<=n-1;i++){
    		for(int j=i+1;j<=n;j++){
    			int x,y,t;
    			t=Extend_gcd((p[i]-p[j]),pos,x,y);
    			//t=gcd((p[i]-p[j]),pos)
    			if((c[j]-c[i])%t)continue;
    			/*
    			*因为解的方程是(p[i]-p[j])x+pos*y =c[j]-c[i];
    			*如果说不整除,那么就没有解 
    			*/
    			Int64 tmp=pos/t;
    			//用pos除以t,得到每一次 x改变多少 
    			tmp=abs(tmp);
    			//保证tmp是正数 
    			x=x%tmp*((c[j]-c[i])/t)%tmp;
    			((x%=tmp)+=tmp)%=tmp;
    			//对解进行修正 
    			if(!x)x+=tmp;
    			if(x<=min(l[j],l[i]))return false ;
    		} 
    	}
    	return true ;
    }
    int main(){
    	scanf("%d",&n);
    	Int64 pos=0;
    	for(int i=1;i<=n;i++){
    		cin>>c[i]>>p[i]>>l[i];
    		pos=max(pos,c[i]);//寻找最大的序号 
    	}
    	while(true){
    		if(check(pos)){
    			printf("%lld",pos);
    			break;
    		}
    		pos++;
    	} 
    	return 0;
    }
    
  • 相关阅读:
    2.Servlet基础
    3.AOP入门1
    1.Tomcat配置
    Linq学习(一)-初涉Linq
    Linq学习(零)-错误汇总
    Intellij IDEA14配置
    大数据插入Excel报错处理
    VS插件-Resharper
    SVN异常处理(五)-状态小图标不见了
    SVN系列学习(四)-TortoiseSVN其他操作
  • 原文地址:https://www.cnblogs.com/perisino/p/10339150.html
Copyright © 2011-2022 走看看