Mrs. Smith is trying to contact her husband, John Smith, but she forgot the secret phone number!
The only thing Mrs. Smith remembered was that any permutation of n
can be a secret phone number. Only those permutations that minimize secret value might be the phone of her husband.
The sequence of n integers is called a permutation if it contains all integers from 1 to n exactly once.
The secret value of a phone number is defined as the sum of the length of the longest increasing subsequence (LIS) and length of the longest decreasing subsequence (LDS).A subsequence ai1,ai2,…,aik where 1≤i1<i2<…<ik≤n is called increasing if ai1<ai2<ai3<…<aik. If ai1>ai2>ai3>…>aik, a subsequence is called decreasing. An increasing/decreasing subsequence is called longest if it has maximum length among all increasing/decreasing subsequences.
For example, if there is a permutation [6,4,1,7,2,3,5], LIS of this permutation will be [1,2,3,5], so the length of LIS is equal to 4. LDS can be [6,4,1], [6,4,2], or [6,4,3], so the length of LDS is 3
.
Note, the lengths of LIS and LDS can be different.So please help Mrs. Smith to find a permutation that gives a minimum sum of lengths of LIS and LDS.
Input
The only line contains one integer n(1≤n≤105) — the length of permutation that you need to build.
Output
Print a permutation that gives a minimum sum of lengths of LIS and LDS.
If there are multiple answers, print any.
Examples
Input
4
Output
3 4 1 2
Input
2
Output
2 1
Note
In the first sample, you can build a permutation [3,4,1,2]
. LIS is [3,4] (or [1,2]), so the length of LIS is equal to 2. LDS can be ony of [3,1], [4,2], [3,2], or [4,1]. The length of LDS is also equal to 2. The sum is equal to 4. Note that [3,4,1,2]
is not the only permutation that is valid.
In the second sample, you can build a permutation [2,1]
. LIS is [1] (or [2]), so the length of LIS is equal to 1. LDS is [2,1], so the length of LDS is equal to 2. The sum is equal to 3. Note that permutation [1,2] is also valid.
题意:给你一个n,让你构造一个长度为n的数列,数列中的值为1~n的其中一个,并且每个数只能出现一次,使得这个序列的最长递增子序列的长度+最长递减子序列的长度最小。让你输出这个序列。
解题思路:最佳的方案就是最长递增子序列的长度和最长递减子序列的长度都为sqrt(n),这样的话 就能满足题目要求。之后和我们把1~n分别分解为长度为sqrt(n)的一些片段,然后先输出大的片段,然后再输出小的片段。
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
const int maxn=1e5+10;
int n;
int main(){
int i,j;
scanf("%d",&n);
int t=sqrt(n),sum=0,st=n-t;j=n;
while(st>0){
for(i=st+1;i<=st+t;i++){
printf("%d ",i);
}
st-=t;
}
st+=t;
for(i=1;i<=st;i++){
printf("%d%c",i,i==st?'\n':' ');
}
return 0;
}