两角相等的证明思路

Posted wanghai0666

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了两角相等的证明思路相关的知识,希望对你有一定的参考价值。

题目来源:算法竞赛进阶指南

题目标签:分治,坐标变换

题目链接:https://www.acwing.com/problem/content/100/

思路:不断递归找到当前点是由上一层中哪个点变换而来,从第一层开始不断向上回溯,通过坐标的变换来找到当前层中的坐标。

 

#include <iostream>
#include <cmath>

using namespace std;
typedef long long LL;
typedef pair<LL, LL> PLL;

PLL calc(LL n, LL m)
{
    if(n == 0) return {0, 0};
    
    //cnt表示n - 1层中一共有多少个节点
    //len表示当前n层的地图的一半的宽度
    LL len = 1ll << n - 1, cnt = 1ll << 2 * n - 2;
    
    //m % cnt 是当前点在上一层中这个点的序号
    auto pos = calc(n - 1, m % cnt);
    auto x = pos.first, y = pos.second;
    //得到当前点在上一层中的坐标
    auto z = m / cnt;
    //当前点在当前地图的哪一个块中

    //将上一层的坐标进行移动,得到当前点在当前层中的坐标
    if(z == 0) return {y, x};
    //左上:逆时针旋转并翻转
    if(z == 1) return {x, y + len};
    //右上:向右平移
    if(z == 2) return {x + len, y + len};
    //右下:向右平移再向下平移
    return {2 * len - 1 - y, len - 1 - x};
    //左下:逆时针旋转,再向下平移
}


int main()
{
    int T;
    cin >> T;
    while(T--)
    {
        LL n, a, b;
        cin >> n >> a >> b;
        auto ac = calc(n, a - 1);
        auto bc = calc(n, b - 1);
        double x = ac.first - bc.first, y = ac.second - bc.second;
        printf("%.0lf
", sqrt(x * x + y * y) * 10);
    }
    return 0;
}

 

以上是关于两角相等的证明思路的主要内容,如果未能解决你的问题,请参考以下文章

证明集合相等

两角和的正切

片段(Java) | 机试题+算法思路+考点+代码解析 2023

javascript常用代码片段

[算法模板]FFT-快速傅里叶变换

TensorFlow.js:那两个张量相等吗?