uva 11657 - Rational Billiard(数学)

题目链接:uva 11657 - Rational Billiard

题目大意:给定一个边界M,N,以及第一个球和第二个球的位置,第一个球以p,q的方向移动,碰到边界后被反弹,和光线的路线一致,问有没有可能集中第二个球。

解题思路:在网上参考别人的思路,首先将横纵坐标扩大相应倍数,保证p,q每移动一次对应在新平面为单位长度,然后只需要考虑横向移动所需要的步数,减掉纵向移动所需的步数后,剩余的步数是否满足周期的倍数即可。考虑四种请况。这题数据非常水,一开始坐标写错也过了。

#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;
typedef long long ll;

ll m, n, x0, y0, x1, y1, p, q;

ll gcd (ll a, ll b) {
    return b == 0 ? a : gcd(b, a % b);
}

bool judge () {
    if (p == 0 || q == 0) {
        ll u = p * (y1-y0) - q * (x1-x0);
        return u == 0;
    }

    ll absq = q < 0 ? -q : q;
    ll absp = p < 0 ? -p : p;
    m *= absq; x0 *= absq; x1 *= absq;
    n *= absp; y0 *= absp; y1 *= absp;
    p /= absp; q /= absq;

    ll d1 = q * (y1-y0) - p * (x1-x0);
    ll d2 = q * (y1-y0) - p * (2*m-x1-x0);
    ll d3 = q * (2*n-y1-y0) - p * (x1-x0);
    ll d4 = q * (2*n-y1-y0) - p * (2*m-x1-x0);
    ll g = gcd(2*m, 2*n);

    if (d1 % g == 0) return true;
    if (d2 % g == 0) return true;
    if (d3 % g == 0) return true;
    if (d4 % g == 0) return true;
    return false;
}

int main () {
    while (scanf("%lld%lld%lld%lld%lld%lld%lld%lld", &m, &n, &x0, &y0, &x1, &y1, &p, &q) == 8) {
        if (!(m || n || x0 || y0 || x1 || y1 || p || q))
            break;
        printf("%s\n", judge() ? "HIT" : "MISS");
    }
    return 0;
}

uva 11657 - Rational Billiard(数学)

时间: 2024-10-27 06:51:03

uva 11657 - Rational Billiard(数学)的相关文章

uva 10808 - Rational Resistors(基尔霍夫定律+高斯消元)

题目链接:uva 10808 - Rational Resistors 题目大意:给出一个博阿含n个节点,m条导线的电阻网络,求节点a和b之间的等效电阻. 解题思路:基尔霍夫定律,任何一点的电流向量为0.就是说有多少电流流入该节点,就有多少电流流出. 对于每次询问的两点间等效电阻,先判断说两点是否联通,不连通的话绝逼是1/0(无穷大).联通的话,将同一个联通分量上的节点都扣出来,假设电势作为变元,然后根据基尔霍夫定律列出方程,因为对于每个节点的电流向量为0,所以每个节点都有一个方程,所有与该节点

uva 10623 - Thinking Backward(数学)

题目链接:uva 10623 - Thinking Backward 题目大意:就是给出N,表示要将平面分解成N份,问有哪些可选则的方案,m表示椭圆.n表示圆形.p表示三角形的个数,m.n.p分别给定范围. 解题思路:本来这题一点思路都没有,但是在论坛上看到一个公式N=2+2m(m?1)+n(n?1)+4mn+3p(p?1)+6mp+6np 这样只要枚举m和p,求解n,判断n是否满足即可,注意n一定是整数. #include <cstdio> #include <cstring>

UVA 10808 - Rational Resistors(高斯消元+并查集+分数+基尔霍夫定律)

UVA 10808 - Rational Resistors 题意:给定一些结点,有一些电阻,电阻分布在边上,给定一个电路图,每次询问两点,求这两点间的等效电阻 思路:根据基尔霍夫定律,任意一点的电流向量为0,这样就能设每个结点的电势,列出方程,利用高斯消元求解,对于无解的情况,肯定是两点不能连通,这个可以利用并查集判断. 此外这题有个很坑的地方啊,就是高斯消元的姿势不够优美就会爆long long 代码: #include <cstdio> #include <cstring>

UVA 10668 - Expanding Rods(数学+二分)

UVA 10668 - Expanding Rods 题目链接 题意:给定一个铁棒,如图中加热会变成一段圆弧,长度为L′=(1+nc)l,问这时和原来位置的高度之差 思路:画一下图可以很容易推出公式,设圆弧扇形部弧度r,那么可以计算出铁棒长度为lr/sin(r)这个公式在[0, pi/2]是单调递增的,所以可以用二分法去求解 要注意的一点是最后答案计算过程中带入mid,之前是带入x(二分的左边值),可实际上x是可能等于0的,而带入mid,由于是double型,所以mid实际上表示是一个非常趋近0

uva 11024 - Circular Lock(数学)

题目链接:uva 11024 - Circular Lock 题目大意:有个2*2的矩阵,给定p,s,P为p数组中所有元素的最大公约数.s为2*2矩阵的初始状态,每次可以选择一行或是一列同时加1,最终使得sij%P=0 解题思路:gij为aij还需要多少可以是P的倍数,判断g11?g12?g21+g22是P的倍数即可. /******************** * A + C = a + k1 * p * B + C = b + k2 * p * A + D = c + k3 * p * B

uva 616 - Coconuts, Revisited(数学)

题目链接:uva 616 - Coconuts, Revisited 题目大意:题目背景和uva 10726是一样的,只是这道题目是给出n,表示椰子的个数,并且猴子的个数为1,问说是否能找到满足的人数,并且要求人数尽量大. 解题思路:枚举人数,然后根据uva 10726推出的公式去求出最后剩下的椰子是否满足平分等判断. #include <cstdio> #include <cstring> #include <cmath> #include <iostream&

uva 617- Nonstop Travel(暴力+数学)

题目链接:uva 617 - Nonstop Travel 题目大意:在一条路上有n个红绿灯,给出红绿灯的位置,以及绿灯,黄灯和红灯的时间,问现在以什么样的速度可以不同停止便通过这条路段.(速度只在30~60km/h) 解题思路:枚举速度,然后判断即可. 注意说黄灯也是可以过的,以及红绿灯的距离是以米为单位的. #include <cstdio> #include <cstring> const int N = 10; struct state { double dis; int

UVa 1639 Candy (数学期望+组合数学+高精度存储)

题意:有两个盒子各有n个糖,每次随机选一个(概率分别为p,1-p),然后吃掉,直到有一次,你打开盒子发现,没糖了! 输入n,p,求另一个盒子里糖的个数的数学期望. 析:先不说这个题多坑,首先要用long double来实现高精度,我先用的double一直WA,后来看了题解是用long double, 改了,可一直改不对,怎么输出结果都是-2.00000,搞了一晚上,真是无语,因为我输入输出数据类型是long double, 结果一直不对 ,可能是我的编译器是C89的吧,和C语言,输入输出格式不同

Uva - 12230 Crossing Rivers (数学期望)

你住在村庄A,每天需要过很多条河到另一个村庄B上班,B在A的右边,所有的河都在A,B之间,幸运的是每条船上都有自由移动的自动船, 因此只要到达河左岸然后等船过来,在右岸下船,上船之后船的速度不变.现在问从A到B的期望时间是多少,假设在出发时船的位置都是 随机分布.人在 陆地上行走的速度为1. 根据数学期望的线性,过每条河的时间为L/v(到河边船刚好开)到3L/v(到河边船刚好开走)的均匀分布,因此期望过河时间为 (L+3L/v)/2=(2*L/v) 加上 D-sum(L) . 1 #includ