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
Copy
4
Output
Copy
3 4 1 2
Input
Copy
2
Output
Copy
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.
选取
块时,自然最小-------> 均值不等式;
对于每一块,我们可以递增排序,整体来看,递减排列即可;
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<string>
#include<cmath>
#include<map>
#include<set>
#include<vector>
#include<queue>
#include<bitset>
#include<ctime>
#include<deque>
#include<stack>
#include<functional>
#include<sstream>
//#include<cctype>
//#pragma GCC optimize("O3")
using namespace std;
#define maxn 500005
#define inf 0x3f3f3f3f
#define INF 999999999999999
#define rdint(x) scanf("%d",&x)
#define rdllt(x) scanf("%lld",&x)
#define rdlf(x) scanf("%lf",&x)
#define rdstr(x) scanf("%s",x)
typedef long long ll;
typedef unsigned long long ull;
typedef unsigned int U;
#define ms(x) memset((x),0,sizeof(x))
const int mod = 10000007;
#define Mod 20100403
#define sq(x) (x)*(x)
#define eps 1e-7
typedef pair<int, int> pii;
#define pi acos(-1.0)
const int N = 1005;
#define REP(i,n) for(int i=0;i<(n);i++)
inline int rd() {
int x = 0;
char c = getchar();
bool f = false;
while (!isdigit(c)) {
if (c == '-') f = true;
c = getchar();
}
while (isdigit(c)) {
x = (x << 1) + (x << 3) + (c ^ 48);
c = getchar();
}
return f ? -x : x;
}
ll gcd(ll a, ll b) {
return b == 0 ? a : gcd(b, a%b);
}
ll sqr(ll x) { return x * x; }
int n;
int a[maxn];
int main()
{
//ios::sync_with_stdio(false);
rdint(n);
int tp = sqrt(n);
int part = n / tp;
for (int i = 1, ed = n, j; i <= n; i += tp) {
for (j = min(n, i + tp - 1); j >= i; j--)a[j] = ed--;
}
for (int i = 1; i <= n; i++)cout << a[i] << ' ';
cout << endl;
return 0;
}