AtCoder Beginner Contest 188 F.+1-1x2

20 篇文章 0 订阅
2 篇文章 0 订阅

题目链接:AtCoder Beginner Contest 188 F.+1-1x2

大致题意

给定整数x, y. 可以执行三个操作: ①把x加1 ②把x减1 ③把x乘2

问: 最少多少步可以把x变成y

解题思路

考虑到把x变成某一个数字y:

  1. 如果x比y大, 那么只能通过执行y - x次 ②
  2. 如果此时y为偶数: 我们可以执行x - y次①, 或者是通过y / 2的情况进行③得到.
  3. 如果此时y为奇数: 同样可以执行x - y次①, 或者是通过(y - 1) / 2 或 (y + 1) / 2的情况进行③得到.

AC代码

#include <bits/stdc++.h>
#define rep(i, n) for (int i = 1; i <= (n); ++i)
using namespace std;
typedef long long ll;
const int N = 1E5 + 10;
ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a; }
ll a[N], s[N];
set<ll> st;
int main()
{
    int n; cin >> n;
    rep(i, n) scanf("%lld", &a[i]);

    for (int i = n; i >= 1; --i) s[i] = gcd(s[i + 1], a[i]);

    rep(i, n - 1) st.insert(a[i] / gcd(a[i], s[i + 1]) * s[i + 1]);

    ll res = 0;
    for (auto& op : st) {
        res = gcd(res, op);
    }
    cout << res << endl;
    return 0;
}

考虑到情况3, 其实也是把当前奇数变成相邻偶数, 去考虑情况2

END

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逍遥Fau

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值