zoukankan      html  css  js  c++  java
  • 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
    ",k);
    40             break;
    41         }
    42     }
    43     return 0;
    44 }
    View Code
  • 相关阅读:
    支付宝接口对接常见问题
    Myeclipse中配置安卓环境
    算法精解概述
    使用Eclipse开始Java编程
    Windows使用SSH管理Ubuntu
    大臣的旅费
    剪格子
    波动数列
    买不到的数目
    逆波兰表达式
  • 原文地址:https://www.cnblogs.com/137shoebills/p/7788107.html
Copyright © 2011-2022 走看看