CodeForces318A-Even Odds(数学)
题目描述
作为一个非主流者,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} 1≤k≤n≤1012
样例解释:在第一个样例中,Volodya 的序列为:{1,3,5,7,9,2,4,6,8,10}。因此第 3 3 3 个位置上的数字是 5 5 5。
提交链接
思路分析
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} k≤oddCount , ➡️ 落在 奇数区
第 k k k 个奇数公式:
ans = 2 k − 1 \text{ans} = 2k - 1 ans=2k−1
-
如果 k > oddCount k > \text{oddCount} k>oddCount ,➡️ 落在 偶数区
设:pos = k − oddCount \text{pos} = k - \text{oddCount} pos=k−oddCount
第 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;
}
更多推荐


所有评论(0)