题意:输入n,输出从0到n的反等差级数,即长度大于2的子序列都不能是等差序列。
题解:二分来写,转换步骤例如:
初始: 0 1 2 3 4 5 6
0 2 4 6 1 3 5
0 4 2 6 1 5 3
递归到长度小于等于1停止。
#include <stdio.h>
#include <string.h>
const int N = 10005;
int s[N], n, temp[N];
void solve(int l, int r) {
if (r - l < 2)
return;
int k = l;
for (int i = l; i <= r; i += 2)
temp[k++] = s[i];
for (int i = l + 1; i <= r; i += 2)
temp[k++] = s[i];
for (int i = l; i <= r; i++)
s[i] = temp[i];
int mid = (l + r) / 2;
solve(l, mid);
solve(mid, r);
}
int main() {
while (scanf("%d", &n) && n) {
for (int i = 0; i < n; i++)
s[i] = i;
solve(0, n - 1);
printf("%d:", n);
for (int i = 0; i < n; i++)
printf(" %d", s[i]);
printf("\n");
}
return 0;
}