using System;
using System.CodeDom;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication4
{
class Program
{
private static void Main(string[] args)
{ var m = new int[,]
{
{1, 2, 3, 4},
{2, 1, 1, 1},
{3, 1, 2, 1},
{4, 1, 1, 1},
};
Console.WriteLine(GetDeterminant(m));
m = new int[,]
{
{1, 2, 3, 4,5,1, 2, 3, 4,5,},
{2, 1, 1, 1,3,1, 2, 3, 4,5,},
{3, 1, 2, 1,8,1, 2, 3, 4,5,},
{4, 1, 1, 1,1,1, 2, 3, 4,5,},
{4, 10, 1, 2,1,1, 2, 3, 4,5,},
{1, 2, 3, 4,5,1, 2, 3, 4,5,},
{2, 1, 1, 1,3,1, 2, 3, 4,5,},
{3, 1, 2, 1,8,1, 2, 3, 4,5,},
{4, 1, 1, 1,1,1, 2, 3, 4,5,},
{4, 10, 1, 2,1,1, 2, 3, 4,5,},
};
Console.WriteLine(GetDeterminant(m));
}
private static void NextPermutation(int[] permutation, ref bool isPositive)
{
int lenght = permutation.Length, firstIndex = 0, secondIndex;
for (int i = 0; i < lenght - 1; i++)
if (permutation[i] < permutation[i + 1])
firstIndex = i;
secondIndex = lenght-1;
while (permutation[firstIndex] > permutation[secondIndex])
secondIndex--;
swapInArray(permutation, firstIndex, secondIndex);
var count = (lenght - firstIndex-1) / 2;
for (int i = 1; i <= count; i++)
swapInArray(permutation, firstIndex + i, lenght - i);
if (count%2 == 0) isPositive = !isPositive;
}
private static void swapInArray(int[] array, int firstIndex, int secondIndex)
{
var temp = array[firstIndex];
array[firstIndex] = array[secondIndex];
array[secondIndex] = temp;
}
static int GetDeterminant(int[,] matrix)
{
var rang = matrix.GetLength(0);
if(rang != matrix.GetLength(1)) // fatal error
throw new Exception("Bad matrix");
if (rang == 1) return matrix[0, 0];
var indexes = new int[rang];
var countOfPermutation = 1;
for (int i = 0; i < rang; i++)
{
indexes[i] = i;
countOfPermutation *= (i + 1);
}
int determinant = 0, multiplication;
bool isPositive = true;
for (int i = 0; i < countOfPermutation; i++)
{
multiplication = 1;
for (int j = 0; j < rang; j++)
multiplication *= matrix[j, indexes[j]];
determinant += multiplication * (isPositive?1:-1);
NextPermutation(indexes,ref isPositive);
}
return determinant;
}
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29kZURvbTsKdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CnVzaW5nIFN5c3RlbS5MaW5xOwp1c2luZyBTeXN0ZW0uVGV4dDsKdXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKCm5hbWVzcGFjZSBDb25zb2xlQXBwbGljYXRpb240CnsKICAgIGNsYXNzIFByb2dyYW0KICAgIHsKICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIE1haW4oc3RyaW5nW10gYXJncykKICAgICAgICB7IHZhciBtID0gbmV3IGludFssXQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB7MSwgMiwgMywgNH0sCiAgICAgICAgICAgICAgICB7MiwgMSwgMSwgMX0sCiAgICAgICAgICAgICAgICB7MywgMSwgMiwgMX0sCiAgICAgICAgICAgICAgICB7NCwgMSwgMSwgMX0sCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIAogICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShHZXREZXRlcm1pbmFudChtKSk7CgogICAgICAgICAgICBtID0gbmV3IGludFssXQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB7MSwgMiwgMywgNCw1LDEsIDIsIDMsIDQsNSx9LAogICAgICAgICAgICAgICAgezIsIDEsIDEsIDEsMywxLCAyLCAzLCA0LDUsfSwKICAgICAgICAgICAgICAgIHszLCAxLCAyLCAxLDgsMSwgMiwgMywgNCw1LH0sCiAgICAgICAgICAgICAgICB7NCwgMSwgMSwgMSwxLDEsIDIsIDMsIDQsNSx9LAogICAgICAgICAgICAgICAgezQsIDEwLCAxLCAyLDEsMSwgMiwgMywgNCw1LH0sCiAgICAgICAgICAgICAgICB7MSwgMiwgMywgNCw1LDEsIDIsIDMsIDQsNSx9LAogICAgICAgICAgICAgICAgezIsIDEsIDEsIDEsMywxLCAyLCAzLCA0LDUsfSwKICAgICAgICAgICAgICAgIHszLCAxLCAyLCAxLDgsMSwgMiwgMywgNCw1LH0sCiAgICAgICAgICAgICAgICB7NCwgMSwgMSwgMSwxLDEsIDIsIDMsIDQsNSx9LAogICAgICAgICAgICAgICAgezQsIDEwLCAxLCAyLDEsMSwgMiwgMywgNCw1LH0sCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShHZXREZXRlcm1pbmFudChtKSk7CiAKCiAgICAgICAgfQoKCiAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBOZXh0UGVybXV0YXRpb24oaW50W10gcGVybXV0YXRpb24sIHJlZiBib29sIGlzUG9zaXRpdmUpCiAgICAgICAgewogICAgICAgICAgICBpbnQgbGVuZ2h0ID0gcGVybXV0YXRpb24uTGVuZ3RoLCBmaXJzdEluZGV4ID0gMCwgc2Vjb25kSW5kZXg7CgogICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmdodCAtIDE7IGkrKykKICAgICAgICAgICAgICAgIGlmIChwZXJtdXRhdGlvbltpXSA8IHBlcm11dGF0aW9uW2kgKyAxXSkKICAgICAgICAgICAgICAgICAgICBmaXJzdEluZGV4ID0gaTsKCiAgICAgICAgICAgIHNlY29uZEluZGV4ID0gbGVuZ2h0LTE7CgogICAgICAgICAgICB3aGlsZSAocGVybXV0YXRpb25bZmlyc3RJbmRleF0gPiBwZXJtdXRhdGlvbltzZWNvbmRJbmRleF0pCiAgICAgICAgICAgICAgICBzZWNvbmRJbmRleC0tOwoKICAgICAgICAgICAgc3dhcEluQXJyYXkocGVybXV0YXRpb24sIGZpcnN0SW5kZXgsIHNlY29uZEluZGV4KTsKICAgICAgICAgICAgdmFyIGNvdW50ID0gKGxlbmdodCAtIGZpcnN0SW5kZXgtMSkgLyAyOwoKICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gY291bnQ7IGkrKykKICAgICAgICAgICAgICAgIHN3YXBJbkFycmF5KHBlcm11dGF0aW9uLCBmaXJzdEluZGV4ICsgaSwgbGVuZ2h0IC0gaSk7CgogICAgICAgICAgICBpZiAoY291bnQlMiA9PSAwKSBpc1Bvc2l0aXZlID0gIWlzUG9zaXRpdmU7CiAgICAgICAgfQoKICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHN3YXBJbkFycmF5KGludFtdIGFycmF5LCBpbnQgZmlyc3RJbmRleCwgaW50IHNlY29uZEluZGV4KQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHRlbXAgPSBhcnJheVtmaXJzdEluZGV4XTsKICAgICAgICAgICAgYXJyYXlbZmlyc3RJbmRleF0gPSBhcnJheVtzZWNvbmRJbmRleF07CiAgICAgICAgICAgIGFycmF5W3NlY29uZEluZGV4XSA9IHRlbXA7CiAgICAgICAgfQoKICAgICAgICBzdGF0aWMgaW50IEdldERldGVybWluYW50KGludFssXSBtYXRyaXgpCiAgICAgICAgewogICAgICAgICAgICB2YXIgcmFuZyA9IG1hdHJpeC5HZXRMZW5ndGgoMCk7CiAgICAgICAgICAgIGlmKHJhbmcgIT0gbWF0cml4LkdldExlbmd0aCgxKSkgLy8gZmF0YWwgZXJyb3IKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkJhZCBtYXRyaXgiKTsKICAgICAgICAgICAgaWYgKHJhbmcgPT0gMSkgcmV0dXJuIG1hdHJpeFswLCAwXTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBpbmRleGVzID0gbmV3IGludFtyYW5nXTsKCiAgICAgICAgICAgIHZhciBjb3VudE9mUGVybXV0YXRpb24gPSAxOwoKICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByYW5nOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGluZGV4ZXNbaV0gPSBpOwogICAgICAgICAgICAgICAgY291bnRPZlBlcm11dGF0aW9uICo9IChpICsgMSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGludCBkZXRlcm1pbmFudCA9IDAsIG11bHRpcGxpY2F0aW9uOwogICAgICAgICAgICBib29sIGlzUG9zaXRpdmUgPSB0cnVlOwoKICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudE9mUGVybXV0YXRpb247IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbXVsdGlwbGljYXRpb24gPSAxOwogICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCByYW5nOyBqKyspCiAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGljYXRpb24gKj0gbWF0cml4W2osIGluZGV4ZXNbal1dOwoKICAgICAgICAgICAgICAgIGRldGVybWluYW50ICs9IG11bHRpcGxpY2F0aW9uICogKGlzUG9zaXRpdmU/MTotMSk7CgogICAgICAgICAgICAgICAgTmV4dFBlcm11dGF0aW9uKGluZGV4ZXMscmVmIGlzUG9zaXRpdmUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gZGV0ZXJtaW5hbnQ7CiAgICAgICAgfQogICAgfQp9Cg==