若矩阵A是可逆的,则A的逆矩阵是唯一的。
。
假设孩子和家长出去旅游,去程坐的是bus,小孩票价为3元,家长票价为3.2元;
回程坐的是Train,小孩票价为3.5元,家长票价为3.6元。问题是分别求小孩和家长的人数。
我们亦可以用下列矩阵求之(纵向)。
#include <cstdio> #include <algorithm> #include <cctype> using namespace std; const int mod=1e9+7,N=888; int n,a[N][N]; inline int add(int a,int b){return a+b>=mod?a+b-mod:a+b;} #define mul(a,b) (1ll*(a)*(b)%mod) int ksm(int d,int k){int f=1;while(k){if(k&1)f=mul(f,d); d=mul(d,d),k>>=1;}return f;} //ksm用于求逆元 int read(){ int x=0;char c=getchar(); while(!isdigit(c)) c=getchar(); while(isdigit(c)) x=x*10+c-‘0‘,c=getchar(); return x; } int main(){ n=read(); for(int i=1;i<=n;i++) //在原矩阵右边接一个单位矩阵↓↓ { for(int j=1;j<=n;j++) a[i][j]=read(); a[i][i+n]=1; } for(int i=1;i<=n;i++){ //矩阵初等变换,即高斯消元 int id=-1; for(int j=i;j<=n;j++) if(a[j][i]){id=j;break;} if(id==-1) return puts("No Solution"),0; std::swap(a[i],a[id]); int inv=ksm(a[i][i],mod-2); for(int j=i;j<=n<<1;j++) a[i][j]=mul(a[i][j],inv); for(int j=i+1;j<=n;j++) for(int k=n<<1;k>=i;k--) a[j][k]=add(a[j][k],mod-mul(a[i][k],a[j][i])); } /* 【原理】把原矩阵通过初等变换消成单位矩阵, 右边的单位矩阵做同样的变换,就成了逆矩阵。 */ for(int i=n;i;i--) for(int j=i-1;j;j--) for(int k=n<<1;k>=i;k--) a[j][k]=add(a[j][k],mod-mul(a[i][k],a[j][i])); for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++) printf("%d ",a[i][j+n]); puts(""); } }
——时间划过风的轨迹,那个少年,还在等你。
原文:https://www.cnblogs.com/FloraLOVERyuuji/p/10397751.html