2021年ACM创新实践班&SDUTACM暑假集训选拔 7-5题解

递归思维题
在这里插入图片描述

我们先除去第一条和第二条光线(因为由等边三角形可以得到光线1+光线2等于ab),剩下的很明显看出是递归。

我们由图看到这需要递归的两条边都是在不断地缩小,而且满足x和y,递归后是y,x % y的关系。 新增加的边数等于2乘以(x - x % y) 的关系。(因为不能整除,所以要先减去多出来的部分。再乘以2)。
还要注意:最后一步时,即x % y == 0时,我们观察一下,由等边三角形的规律,我们发现,增加的边数等于2 * x - y(因为y前面已经算入)。结合参考代码更好理解。

参考代码:

#include <algorithm>
#include <cstdio>
#include <iostream>
using namespace std;
typedef long long ll;

ll s;
void dfs(ll x, ll y) {
    if (x % y == 0) {  // 达到了出口
        s += x * 2 - y;
        return;
    } else {
        s += (x - x % y) * 2;  // 推理得公式
        dfs(y, x % y);         // 递归
    }
}
int main() {
    ll n, m;
    scanf("%lld%lld", &n, &m);
    s = n;
    n -= m;
    if (n < m) swap(n, m);
    dfs(n, m);
    printf("%lld\n", s);
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值