HDOJ-2552 三足鼎立——数学不是白学的

04/09/2015

描述

MCA 山中人才辈出,洞悉外界战火纷纷,山中各路豪杰决定出山拯救百姓于水火,曾以题数扫全场的威士忌,曾经高数九十九的天外来客,曾以一剑铸十年的亦纷菲,歃血为盟,盘踞全国各个要塞(简称全国赛)遇敌杀敌,遇佛杀佛,终于击退辽军,暂时平定外患,三人位置也处于稳态。

可惜辽誓不甘心,辽国征南大将军<耶律 javac++>欲找出三人所在逐个击破,现在他发现威士忌的位置 s,天外来客的位置 u,不过很难探查到亦纷菲 v 所在何处,只能知道三人满足关系:

arctan(1 / s) = arctan(1 / u) + arctan(1 / v)

定义 f(s,u,v)=v*u-s*u-s*v 的值为”三足鼎立”

<耶律 javac++>想计算<三足鼎立>的值

输入

首先输入一个 t,表示有 t 组数据,跟着 t 行:

输入 s, u(s <= 12^3; u <= 2^20; s, u, v > 0), s, u, v 均为实数

输出

输出 v * u – s * u – s * v 的值,为了简单起见,如果是小数,直接取整

比如:答案是 1.7,则输出 1。

分析

第一感觉,这题一定是个纯模拟,反正 arctan 是可以算的。

不过,仔细想过之后发现,这个题反而是用 arctan 好好的骗了我们一把——当你看到 f(s,u,v) = v * u – s * u – s * v 的时候是不是反映到了 tan 的运算法则呢?

所以,我觉得这是一道数学题。

运算

中等数学告诉我们

tan(a + b) = (tan(a) + tan(b)) / (1 – tan(a) * tan(b)) (1)

tan(arctan(a)) = a (2)

有了以上两个基本准则,我们针对 arctan(1 / s) = arctan(1 / u) + arctan(1 / v)进行推导:

tan(arctan(1 / s)) = tan(arctan(1 / u) + arctan(1 / v))

1 / s=(1 / u + 1 / v) / (1 – 1 / u * v)

1 / s – 1 / s * u * v = 1 / u + 1 / v

v * u – s * u – s * v = 1

所以,我们居然推导出了这道题的结果直接为1!数感拯救世界!

代码

#include <stdio.h>
int main(int argc, const char * argv[]) {
    int n, a, b;
    scanf("%d", &n);
    while(n--) {
        scanf("%d %d", &a, &b);
        printf("1\n");
    }
    return 0;
}