Предыдущая оценка уже существенно устарела!
Удалось найти точное количество перестановок удовлетворяющих условию задачи и при этом (одновременно) начинающихся с числа от 1 до 5 и заканчивающихся числом от 96 до 100.
Таких перестановок 8265113664188550.
Вместе с обратными перестановками это даёт новую нижнюю оценку —
16530227328377100 способов.
Следующая программа для Maple вычисляет количество перестановок чисел от 1 до
, удовлетворяющих условию задачи и при этом начинающихся с числа от 1 до 5 и заканчивающихся числом от
до
для
от 10 до 100.
Код:
restart: x:=array(1..101, 1..2): for n from 1 to 101 do: x[n, 1]:=0: x[n, 2]:=0: od: x[4,2]:=1: x[5,2]:=2:
for n from 4 to 100 do: if n mod 3 > 0 then x[n,1]:=x[n,1]+1: x[n+1,1]:=1: fi: od:
for k from 6 to 100 do:
x[k,2]:=x[k-5,1]+x[k-5,2]:
for n from 4 to k-4 do: if n mod 3 > 0 then x[k,1]:=x[k,1]+x[k-n,1]+x[k-n-1,1]+x[k-n-1,2]: fi: od:
od:
for k from 10 to 100 do: print(k, x[k,1]+x[k-1,1]+x[k,2]+x[k-1,2]+x[k-6,1]+x[k-6,2]): od:
Примечание: правильность результата для
была проверена прямым перечислением указанных перестановок с помощью следующей программы на с++:
Код:
#include <fstream.h>
ofstream file1("2-3 (5-5) Перестановки.txt");
int x[50][50];
void next(int n, int m);
void next(int n, int m)
{int i, j, k;
if(n==m-3)
{i=(x[m-3][m-4]-x[m-2][m-4])*(x[m-3][m-4]-x[m-2][m-4]);
if(i==4 || i==9)
{j=(x[m-3][m-4]-x[m-4][m-4])*(x[m-3][m-4]-x[m-4][m-4]);
if(j==4 || j==9)
{k=(x[m-1][m-4]-x[m-2][m-4])*(x[m-1][m-4]-x[m-2][m-4]);
if(k==4 || k==9){x[49][0]++;}
}
j=(x[m-3][m-4]-x[m-1][m-4])*(x[m-3][m-4]-x[m-1][m-4]);
if(j==4 || j==9)
{k=(x[m-4][m-4]-x[m-2][m-4])*(x[m-4][m-4]-x[m-2][m-4]);
if(k==4 || k==9){x[49][0]++;}
}
}
}
if(n<m-3)
{for (i=n; i<m-1; i++)
{j=(x[i][n-1]-x[n-1][n-1])*(x[i][n-1]-x[n-1][n-1]);
if(j==4 || j==9)
{for (k=n; k<m; k++){x[k][n]=x[k][n-1];}
x[i][n]=x[n][n-1]; x[n][n]=x[i][n-1];
next(n+1, m);}
}
}
return;
}
void main(void)
{int i1, i2, j, m;
for (m=10; m<36; m++)
{x[49][0]=0;
for (i1=0; i1<m; i1++){x[i1][0]=i1+1;}
for (i1=0; i1<5; i1++)
{j=x[0][0]; x[0][0]=x[i1][0]; x[i1][0]=j;
for (i2=m-1; i2>m-6; i2--)
{j=x[m-1][0]; x[m-1][0]=x[i2][0]; x[i2][0]=j; next(1, m);}
}
file1 << m << ", " << x[49][0] << endl << endl;
}
}