Gorilla 和 Noobish_Monk 发现了三个数字 n 、 m 和 k ( m<k )。他们决定构造一个长度为 n 的排列组合 † 。
对于这个排列,Noobish/Monk 想到了下面的函数: g(i) 是长度为 i 的前缀上的排列中所有不大于 m 的数字之和。同样,Gorilla 提出了函数 f ,其中 f(i) 是长度为 i 的前缀上不小于 k 的排列中所有数字之和。长度为 i 的前缀是由原始数组的前 i 个元素组成的子数组。
例如,如果 n=5 , m=2 , k=5 ,且排列为 [5,3,4,1,2] ,那么:
- 𝑓(1)=5 ,因为 5≥5 ; 𝑔(1)=0 ,因为 5>2 ;
- 𝑓(2)=5 ,因为 3<5 ; 𝑔(2)=0 ,因为 3>2 ;
- 𝑓(3)=5 ,因为 4<5 ; 𝑔(3)=0 ,因为 4>2 ;
- 𝑓(4)=5 ,因为 1<5 ; 𝑔(4)=1 ,因为 1≤2 ;
- 𝑓(5)=5 ,因为 2<5 ; 𝑔(5)=1+2=3 ,因为 2≤2 。
帮助他们找出一个使 (∑𝑖=1𝑛𝑓(𝑖)−∑𝑖=1𝑛𝑔(𝑖)) 的值最大的排列。
† 长度为 n 的排列是由 n 个不同的整数组成的数组,这些整数的顺序从 1 到 n 不等。例如, [2,3,1,5,4] 是一个排列,但 [1,2,2] 不是排列(因为 2 在数组中出现了两次), [1,3,4] 也不是排列(因为 n=3 ,但 4 出现在数组中)。
输入
第一行包含一个整数 t ( 1≤t≤10^4 ) - 测试用例的数量。
每个案例的唯一一行包含三个整数 n , m, k ( 2≤n≤10^5 ; 1≤m<k≤n)--要构建的排列的大小和两个整数。
保证所有测试用例中 n 的总和不超过 2⋅10^5 。
输出
对于每个测试用例,输出排列组合,即满足问题条件的一组数字。如果有多个解决方案,则输出其中任何一个。
Example
input
3
5 2 5
3 1 3
10 3 8
output
5 3 4 1 2
3 2 1
10 9 8 4 7 5 6 1 2 3
Note
In the first example, (∑ni=1f(i)−∑ni=1g(i))=5⋅5−(0⋅3+1+3)=25−4=21
代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
int a[10000010];
signed main(){
int t;
cin>>t;
while(t--){
int n,m,k;
cin>>n>>m>>k;
// n-m+1 1-m
while(n){
cout<<n<<" ";
n--;
if(n<=m)break;
}
for(int i=1;i<=m;i++){
cout<<i<<" ";
}
cout<<endl;
}
return 0;
}