题目描述

作为一个非主流者,Volodya 对当前事物的状态感到不满,特别是对自然数的顺序(自然数是正整数)感到不满。
他决定重新排列它们。由于自然数太多了,Volodya 决定只考虑前 n n n 个。

他写下了以下序列:

  • 首先是从 1 1 1 n n n 的所有奇数(按升序排列);
  • 然后是从 1 1 1 n n n 的所有偶数(也按升序排列)。

请你帮助 Volodya 找出在位置 k k k 上的数字是多少。

输入格式

输入一行,包含两个整数 n , k n, k n,k

输出格式

输出一个整数,表示在 Volodya 构造的序列中,第 k k k 个位置上的数字。

输入输出样例

输入 #1

10 3

输出 #1

5

输入 #2

7 7

输出 #2

6

说明/提示

数据范围: 1 ≤ k ≤ n ≤ 1 0 12 1 \leq k \leq n \leq 10^{12} 1kn1012

样例解释:在第一个样例中,Volodya 的序列为:{1,3,5,7,9,2,4,6,8,10}。因此第 3 3 3 个位置上的数字是 5 5 5

提交链接

Even Odds

思路分析

Volodya 构造的序列是:

  • 🔴 奇数部分 1 , 3 , 5 , … 1, 3, 5, \dots 1,3,5,
  • 🔵 偶数部分 2 , 4 , 6 , … 2, 4, 6, \dots 2,4,6,

✨ 第一步:确定奇数的数量

n n n 个自然数中奇数的个数:

oddCount = n + 1 2 \text{oddCount} = \frac{n+1}{2} oddCount=2n+1

👉 因为如果 n n n 是奇数,奇数会比偶数多一个。

✨ 第二步:判断 k k k 的位置

  • 如果 k ≤ oddCount k \leq \text{oddCount} koddCount , ➡️ 落在 奇数区

    k k k 个奇数公式:

    ans = 2 k − 1 \text{ans} = 2k - 1 ans=2k1

  • 如果 k > oddCount k > \text{oddCount} k>oddCount ,➡️ 落在 偶数区
    设:

    pos = k − oddCount \text{pos} = k - \text{oddCount} pos=koddCount

    p o s pos pos 个偶数公式:

    ans = 2 × pos \text{ans} = 2 \times \text{pos} ans=2×pos

参考代码

#include <bits/stdc++.h>
using namespace std;

int main()
{
    long long n, k;
    cin >> n >> k;
    /*排列p : 1 ~ n 奇数 + 1 ~ n 偶数*/

    /*奇数的最后一位*/
    long long pos;
    if (n & 1)
        pos = n / 2 + 1;
    else
        pos = n / 2;
    
    if(k <= pos)  /*只考虑奇数序列*/
    {
        /*首项为 1,公差为 2*/
        cout << 1 + (k - 1) * 2;
    }
    else
    {
        k -= pos;  /*考虑偶数序列*/
        /*首项为 2,公差为 2*/
        cout << 2 + (k - 1) * 2;

    }
    return 0;
}
Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐