解析在代码后面
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <cmath>
using namespace std;
int gcd(int a,int b) { return !b ? a : gcd(b,a%b); }
bool solve()
{
int n,m,x,y;
scanf('%d%d',&n,&m);
x=0;
for (int i=1;i<=n;++i)
{
scanf('%d',&y);
x=gcd(x,abs(y));
}
if (n==1) return y==m;
if (!x) return !m;
return !(abs(m)%x);
}
int main()
{
freopen('det.in','r',stdin);
freopen('det.out','w',stdout);
int t;
scanf('%d', &t);
while(t--)
if (solve()) printf('Y\n');
else printf('N\n');
}
解析:
令g=gcd(X11,X12,X13……)
则行列式可能为D的充要条件为g|D
1、g|D为必要条件:
由定义来算行列式的时候,每一项都要从第一行里取一个数,所以g|D
2、g|D为充分条件:
首先可以通过矩阵的初等变换,将矩阵X消成对角矩阵
其中,X11* X22 * X33* X44=D
上述矩阵等价于
把D拆为g*D/g
还原到矩阵中
即
X22=
联系客服