zoukankan      html  css  js  c++  java
  • Openjudge NOI题库 数论4975 两只鼹鼠

    Openjudge NOI题库 数论4975 两只鼹鼠

    总时间限制:
    
    1000ms
    
    内存限制:
    
    65536kB
    
    描述
    
    一个圆形花圃被分为k个扇形区域(0,1,…,k-1)。有两只小鼹鼠A,B分别位于其中的两个区域。鼹鼠从一个扇形区域移动到相邻的区域需要1分钟。已知A鼹鼠总是沿顺时针方向移动(序号增大),B鼹鼠总是沿逆时针方向移动(序号减小),两只鼹鼠都是每隔一段时间钻出地面一次。请你求出两只鼹鼠第一次同时在同一个扇形区域钻出地面的时间。如果永远遇不到,则输出“no answer”。
    
     
    
    输入
    
    第一行为一个整数k,表示扇形区域的个数。1 <= k< = 10000
    第二行为两个整数la,lb分别表示两只鼹鼠初始时所处的位置。0 <= la, lb < k。
    第三行为两个整数sA,sB分别为两只鼹鼠钻出地面的间隔时间。0 < sA, sB < 100。
    第四行为两个整数fa,fb分别为两只鼹鼠第一次钻出地面的时间。0 <= fa < sA, 0 <= fb < sB。
    
    输出
    
    用一个整数表示两只鼹鼠第一次同时在同一个扇形区域钻出地面的时间。
    若两只鼹鼠永远无法相遇,输出“no answer”。
    
    样例输入
    
    7
    
    1 5
    
    3 5
    
    1 2
    
    样例输出
    
    37

    分析:

          转换模型——

    不妨叫它“打地鼠”模型——你懂的

          把圆形区域拉成无限长的数轴,A从SA开始,B从SB开始,每次钻出点为A=(la+fa+x*sA),B=(lb-fb-y*sB),其中x,y∈N*;解x,y满足:

    1)         A-SA==B-SB,经过的时间相同

    2)         (A-B)%k==0,A,B在圆上同一个位置

     

    整理1)方程,

          A-SA=B-sB

          fa+x*sA= -fb-y*sB

          x*sA= -fa-fb-y*sB

    ① |x*sA|=|y*sB+fa+fb|

    ② 即 sA的x倍数-(fa+fb) = sB的倍数

     

    整理2)方程

          (A-B)%k=0

          (la+fa+x*sA)-(lb-fb-y*sB)%k=0

          ( la-lb + x*sA + y*sB+fa+fb )%k==0

    将①带入得

          ( la-lb + 2x*sA)%k==0

    ③ 即 sA的2x倍数+(la-lb)k的倍数

     

    综上,于是我们可以从0开始枚举x,使得x同时满足②③即可。

  • 相关阅读:
    ArrayList的subList方法
    easyui-datagrid 的loader属性用法
    easyui-datagrid 编辑模式详解
    C++归并排序总结
    2016阿里巴巴笔试题
    leetCode(38):Lowest Common Ancestor of a Binary Search Tree
    Codeforces Round #271 (Div. 2) 解题报告
    Android平台Camera实时滤镜实现方法探讨(九)--磨皮算法探讨(一)
    Docker部署JavaWeb项目实战
    广东省知名P2P平台资料
  • 原文地址:https://www.cnblogs.com/CXSheng/p/7459503.html
Copyright © 2011-2022 走看看