Хорошо, это не так, но, похоже, работает!
Я запустил эту тестовую программу (C #):
static void Main(string[] args) {
for (int j = 3; j < 100; j++) {
int x = 0;
for (int i = 1; i <= j; i++) {
x ^= i;
}
Console.WriteLine("j: " + j + "\tx: " + x + "\tj%4: " + (j % 4));
}
}
Краткое объяснение: x - это результат всех XOR для одного списка, i - элемент в определенном списке, а j - размер списка. Поскольку все, что я делаю, это XOR, порядок элементов не имеет значения. Но я смотрю на то, как выглядят правильные перестановки при применении.
Если вы посмотрите на j% 4, вы можете переключиться на это значение и получить что-то вроде этого:
bool IsPermutation = false;
switch (j % 4) {
case 0:
IsPermutation = (x == j);
break;
case 1:
IsPermutation = (x == 1);
break;
case 2:
IsPermutation = (x == j + 1);
break;
case 3:
IsPermutation = (x == 0);
break;
}
Теперь я признаю, что это, вероятно, требует некоторой тонкой настройки. Это не 100%, но это хороший простой способ начать. Возможно, с небольшими проверками, выполняемыми в цикле XOR, это может быть улучшено. Попробуйте начать где-то там.