HDOJ-2552 三足鼎立——数学不是白学的
描述
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; }
发表评论