zoukankan      html  css  js  c++  java
  • HDU 4596 Yet another end of the world(解一阶不定方程)

    Yet another end of the world

    Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
    Total Submission(s): 920    Accepted Submission(s): 400


    Problem Description
    In the year 3013, it has been 1000 years since the previous predicted rapture. However, the Maya will not play a joke any more and the Rapture finally comes in. Fortunately people have already found out habitable planets, and made enough airships to convey all the human beings in the world. A large amount of airships are flying away the earth. People all bear to watch as this planet on which they have lived for millions of years. Nonetheless, scientists are worrying about anther problem…
    As we know that long distance space travels are realized through the wormholes, which are given birth by the distortion of the energy fields in space. Airships will be driven into the wormholes to reach the other side of the universe by the suction devices placed in advance. Each wormhole has its configured attract parameters, X, Y or Z. When the value of ID%X is in [Y,Z], this spaceship will be sucked into the wormhole by the huge attraction. However, the spaceship would be tear into piece if its ID meets the attract parameters of two wormholes or more at the same time.
    All the parameters are carefully adjusted initially, but some conservative, who treat the Rapture as a grain of truth and who are reluctant to abandon the treasure, combine with some evil scientists and disrupt the parameters. As a consequence, before the spaceships fly into gravity range, we should know whether the great tragedy would happen or not. Now the mission is on you.
     
    Input
    Multiple test cases, ends with EOF.
    In each case, the first line contains an integer N(N<=1000), which means the number of the wormholes.
    Then comes N lines, each line contains three integers X,Y,Z(0<=Y<=Z<X<2*109).
     
    Output
    If there exists danger, output “Cannot Take off”, else output “Can Take off”.
     
    Sample Input
    2 7 2 3 7 5 6 2 7 2 2 9 2 2
     
    Sample Output
    Can Take off Cannot Take off

    题目大意:

      这道题是说,给你n个x,y,z。问是否存在某个id,使得 id%x>=y&&id%x<=z

      y <= z < 2*10^9

    解题思路:

      设  id/x1 = a1; id/x2 = a2;

       id%x1=b1; id%x2=a2;

    -> id = x1*a1+b1,  id = x2*a2+b2

    ->x1*a1+b1 = x2*a2+b2;

    ->x1*a1-x2*a2 = b2-b1;

    现在就来看看该怎么求解这个线性方程组了。首先,线性方程组有整数解的条件是b2-b1是gcd(x1,x2)的整数倍数。

    那么,我们就可以得到只需要判断一下两个区间[yi,zi]和[yj,zj]的差值区间[yj-zi,zj-yi]是否可能存在gcd(xi,xj)的倍数的结论

    代码:

    # include<cstdio>
    # include<iostream>
    
    using namespace std;
    
    # define MAX 1234
    
    int x[MAX],y[MAX],z[MAX];
    int n;
    
    int gcd ( int a,int b )
    {
        if ( b==0 )
            return a;
        else
            return gcd(b,a%b);
    }
    
    int ok ( int t,int l,int r )
    {
        if ( l%t==0||r%t==0 )
            return 1;
        if ( l<0&&r>=0 )
            return 1;
        if ( r/t-l/t > 0 )
            return 1;
        return 0;
    }
    
    int solve()
    {
        for ( int i = 1;i <= n;i++ )
        {
            for ( int j = i+1;j <= n;j++ )
            {
                int tmp = gcd(x[i],x[j]);
                if ( ok(tmp,y[i]-z[j],z[i]-y[j]) )
                    return 1;
            }
        }
        return 0;
    }
    
    int main(void)
    {
        while ( scanf("%d",&n)!=EOF )
        {
            for ( int i = 1;i <= n;i++ )
                scanf("%d%d%d",&x[i],&y[i],&z[i]);
            if ( solve() )
                puts("Cannot Take off");
            else
                puts("Can Take off");
        }
        
        return 0;
    }
    

      

  • 相关阅读:
    sql server 中 bit 字段的 查询方法
    C# 4.0新特性"协变"与"逆变"以及背后的编程思想
    marginleft是做边距,是宽度 left是定位盒子左上角左边位置的一个点
    什么是企业库 怎么使用企业库 企业库的好处 企业库的目标
    SQL各种Join用法(Full,Left,Out,Inner)
    JavaScript计算两个文本框内数据的乘积(四舍五入保留两位小数)
    SQL VIEW(视图)
    Sql ISNULL() 函数
    left join 和 left outer join 有什么区别
    18个不常见的C#关键字,您使用过几个?
  • 原文地址:https://www.cnblogs.com/wikioibai/p/4780238.html
Copyright © 2011-2022 走看看