给一个正整数n,构造一个0...n-1的排列,使得这个排列的任何一个长度大于2的子序列都不为等差数列。
#include <cstdio>
int pre[10005],last[10005];
int n;
void divide_conquer(int l,int r)
{
if(l + 1 >= r)
return ;
int i, j;
for(i = l; i <= r; i++)
last[i] = pre[i];
for(i = l, j = l; j <= r; i++, j += 2)
pre[i] = last[j];
for(j = l + 1; j <= r; i++, j += 2)
pre[i] = last[j];
divide_conquer(l, (l + r) / 2);
divide_conquer((l + r) / 2 + 1, r);
}
int main()
{
while(scanf("%d",&n) && n)
{
for(int i=0; i< n; i++)
{
pre[i] = i;
}
printf("%d: ", n);
divide_conquer(0,n-1);
for(int i = 0; i < n; i++)
printf("%d%c", pre[i], i == n - 1 ? '\n' : ' ');
}
return 0;
}