解析在代码后面 #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= |
|