1 条题解

  • 0
    @ 2025-8-24 22:05:13

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Chinese_zjc_
    发生肾么事了?

    搬运于2025-08-24 22:05:13,当前版本为作者最后更新于2020-09-03 18:55:41,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    先看下面这张图:

    Photo1

    B B A A 顺时针旋转的时候, C C , D D , E E 等点也随着 B B 一起旋转.

    从题目配图中显然可以看出, A A , B B , C C , D D , E E 五点之间的相对位置不会改变.

    那我们直接可以把 v v , t t 这些量忽略掉,于是这道题目就成了静态.

    而且由于正五边形存在对称轴,因此只需要考虑 3 3 个点 CC , D D , EE 能否攻击到 A A .

    我们设 A:(0,0) A:(0,0) , B B y y 轴上.

    易得: B:(0,R) B:(0,R) , C:(0,Rr) C:(0,R-r) ,正五边形关于 y y 轴对称.

    然后我们来求 D D E E 的坐标.

    BFBC BF\bot BC交于点 B B , DFBF DF\bot BF 交于点 F F , EGBFEG\bot BF交于点 G G .

    如图:

    则易得 DBF=18 \angle DBF=18^\circ , EBG=54 \angle EBG=54^\circ .

    再使用三角函数,即得: $ D:(-\cos(18^\circ)\times r,R-\sin(18^\circ)\times r) $ , $ E:(-\cos(54^\circ)\times r,R+\sin(54^\circ)\times r) $ .

    再考虑子弹方向:

    对于 D D E E 第一个子弹的方向分别是射线 DF DF 和射线 GE GE .

    对于第 i+1 i+1 个子弹,相对于第 1 1 个子弹顺时针旋转了 360k×i \frac{360^\circ}{k}\times i .

    因此若 D D E E 要射到 A A , 180AEG 180^\circ-\angle AEG 180AFD 180^\circ-\angle AFD 必须得是 360k \frac{360^\circ}{k} 的倍数.

    让我们求出 AEG \angle AEG AFD \angle AFD 的度数.

    依然是三角函数:

    $$\angle AEG=\arctan(\frac{\cos(18^\circ)\times r}{R-\sin(18^\circ)\times r})\\ \angle AFD=\arctan(\frac{\cos(54^\circ)\times r}{R+\sin(54^\circ)\times r})\\ $$

    这样,直接计算判断即可,而 B B 射到 A A 的情况显然当且仅当 k k 为偶数.

    那我们就可以愉快地写代码了.

    Code #1Code\ \#1:

    //This Code was made by Chinese_zjc_.
    #include<cstdio>
    #include<cmath>
    #define int long long
    #define PI 3.14159265358979323
    #define EQUAL 0.00000000000001
    #define double long double
    using namespace std;
    int T,k;
    double r,R,v,t,siz[5],atime;
    bool answered;
    double _360topi(const double IN)
    {
        return IN/180*PI;
    }
    signed main()
    {
        scanf("%lld",&T);
        while(T--)
        {
            scanf("%Lf%Lf%Lf%Lf%lld",&r,&R,&v,&t,&k);
            answered=false;
            if(!(k&1))
            {
                puts("no");
                continue;
            }
            siz[1]=_360topi(180)-atan((cos(_360topi(18))*r)/(R-sin(_360topi(18))*r));
            siz[2]=_360topi(180)-atan((cos(_360topi(54))*r)/(R+sin(_360topi(54))*r));
            atime=PI*2/k;
            for(int i=1;i<=2;++i)
            {
                int tim=siz[i]/atime+EQUAL;
                if(abs(tim*atime-siz[i])<EQUAL)
                {
                    puts("no");
                    answered=true;
                    break;
                }
            }
            if(!answered)
            {
                puts("yes");
            }
        }
        return 0;
    }
    

    回头看到式 (1) (1) ,这就不禁让人想问了:

    是不是它们都是无理数?

    这是显然的,证明略.

    那我们就可以拿出我们在二年级就学过的知识:

    无理数除以一个有理数的结果必定为无理数.

    很显然,因此证明略.

    那代码可以进行简化:

    Code #2Code\ \#2:

    //This Code was made by Chinese_zjc_.
    #include<cstdio>
    using namespace std;
    int T,k;
    double r,R,v,t;
    signed main()
    {
        scanf("%lld",&T);
        while(T--)
        {
            scanf("%lf%lf%lf%lf%lld",&r,&R,&v,&t,&k);
            puts(k&1?"yes":"no");
        }
        return 0;
    }
    
    • 1

    難題「龍の頸の玉 -五色の弾丸-」

    信息

    ID
    3799
    时间
    500ms
    内存
    125MiB
    难度
    3
    标签
    递交数
    0
    已通过
    0
    上传者