第二题:T2数对排序
标签:数学、思维
题意:由两个自然数组成的一对数称之为有序数对,有序是指数对的第一项与第二项是区别的,例如
(
0
,
1
)
(0,1)
(0,1),
(
1
,
0
)
(1,0)
(1,0)是不一样的数对。对所有有序数对进行排序,先按照每对中两数之和从小到大排序,两数之和相同,再按照每个数对中第一个数从小到大排序。
例如前
6
6
6个数对为
(
0
,
0
)
,
(
0
,
1
)
,
(
1
,
0
)
,
(
0
,
2
)
,
(
1
,
1
)
,
(
2
,
0
)
(0,0), (0,1), (1,0), (0,2), (1,1), (2,0)
(0,0),(0,1),(1,0),(0,2),(1,1),(2,0)
给定一个整数
k
k
k,求出第
k
k
k个数对。
(
1
≤
k
≤
1
,
000
,
000
,
000
)
(1≤k≤1,000,000,000)
(1≤k≤1,000,000,000)
题解:我们列一下前几个,找下规律:
(
0
,
0
)
(0,0)
(0,0)、
(
0
,
1
)
,
(
1
,
0
)
(0,1), (1,0)
(0,1),(1,0)、
(
0
,
2
)
,
(
1
,
1
)
,
(
2
,
0
)
(0,2), (1,1), (2,0)
(0,2),(1,1),(2,0)、
(
0
,
3
)
,
(
1
,
2
)
,
(
2
,
1
)
,
(
3
,
0
)
(0,3), (1,2), (2,1),(3,0)
(0,3),(1,2),(2,1),(3,0)、
(
0
,
4
)
,
(
1
,
3
)
,
(
2
,
2
)
,
(
3
,
1
)
,
(
4
,
0
)
(0,4), (1,3), (2,2),(3,1),(4,0)
(0,4),(1,3),(2,2),(3,1),(4,0)
能够发现数对之和为
0
0
0的有
1
1
1个;数对之和为
1
1
1的有
2
2
2个;数对之和为
2
2
2的有
3
3
3个;数对之和为
3
3
3的有
4
4
4个…
我们可以用
(
1
+
n
)
∗
n
2
\frac {(1+n)*n}{2}
2(1+n)∗n公式,确定要找的第
k
k
k个数对两项之和为多少,因为第
1
1
1个数对是从
(
0
,
0
)
(0,0)
(0,0)开始的,所以找到的时候要
n
−
1
n-1
n−1,最后输出的时候,要注意对于每个之和为
n
n
n的第一项数也是从
0
0
0开始的,所以
k
k
k也需要减
1
1
1。
代码:
#include <bits/stdc++.h>
using namespace std;
int main() {
int k, n = 0;
cin >> k;
while ((1 + n) * n / 2 < k) n++;
n--;
k -= (1 + n) * n / 2;
k--;
cout << k << " " << n - k << endl;
return 0;
}