精华内容
下载资源
问答
  • 怎么求矩阵对应的

    2018-12-24 15:39:00
    对矩阵做初等行变换,化为上三角形 或 对角型, 主对角元素不为0的列即为该矩阵的一组基。 A =这个矩阵对应的一个基 为 ,, 其实,将第二行的 -1 倍加到第一行上,化为 所以基也可以是,,这个就对应的平面直角...

     

    怎么求矩阵对应的基呢?

    对矩阵做初等行变换,化为上三角形 或 对角型, 主对角元素不为0的列即为该矩阵的一组基

    A  =  这个矩阵对应的一个基 为   , ,

    其实,将第二行的 -1 倍加到第一行上,化为

     

    所以也可以是,,这个就对应的平面直角坐标系的正交的一组基。

     

    (啰嗦一下,A矩阵其实对应的平面内的向量的变换, 伸缩变换和旋转变换。)

    可求得,A矩阵的一个相似矩阵 B = , (相似矩阵,   迹相等,行列式相等)

    根据矩阵相似的含义, 存在可逆矩阵p, 使得 , 其实也是 BP = AP,    且 |P| 0

     

    下面问题 : 1,怎么求 可逆矩阵P ?

     自己根据定义,设, 求出 

     

     

     

     

     

     

     

     

     

     

     

    对该矩阵做初等行变换,化为上三角形或者对角型,主对角线元素不为零的列即为该矩阵的一组基.

     

    转载于:https://www.cnblogs.com/oxspirt/p/10168921.html

    展开全文
  • 注意:线性的本质是解异或方程它与高斯消元的本质区别是:没有回代,于是可以在log情况下出最大值于是怎么搞?Insert表示插入,原理是把每个数映射进数组,是原数集的异或集,可以理解用On的线性空间压制了...

    注意:线性基的本质是解异或方程组

    它与高斯消元的本质区别是:没有回代,于是可以在log情况下求出最大值

    于是怎么搞?

    Insert表示插入,原理是把每个数映射进数组,是原数集的异或集,可以理解用On的线性空间压制了一个On^2的东西。

    那么查询最大值就是按位贪心。

    从大到小,因为高位只是表示是否存在这一位,并不表示只有这一种。

    和异或高斯消元的求可达性是本质如一的。

    注意!!!!

    由于常量数(1啊,233啊,999之类)是INT

    所以要转long long

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cmath>
    #include<cstring>
    using namespace std;
    const int N=2e6+100;
    typedef int INT;
    #define int long long 
    inline void read(int &x){
    	x=0;
    	int f=1;
    	char ch=getchar();
    	while(ch<'0'||ch>'9'){
    		if(ch=='-')f=-1;
    		ch=getchar();
    	}
    	while(ch>='0'&&ch<='9'){
    		x=x*10+ch-'0';
    		ch=getchar();
    	}
    	x*=f;
    }
    struct Linear_basis{
    	int a[N];
    	Linear_basis(){
    		memset(a,0,sizeof(a));
    	}
    	bool Insert(int x){
    		for(int i=60;i>=0;i--){
    			if(x&((int)1<<i)){
    				if(!a[i]){
    					a[i]=x;
    					break;
    				}
    				x^=a[i];
    			}
    		}
    		return x>0;
    	}
    	int Query(){
    		int ret=0;
    		for(int i=60;i>=0;i--){
    			if((ret^(a[i]))>ret)
    				ret^=(a[i]);
    		}
    		return ret;
    	}
    }A; 
    INT main(){
    	int n;
    	read(n);
    	for(int i=1;i<=n;i++){
    		int x;
    		read(x);
    		A.Insert(x);
    	}
    	cout<<A.Query();
    }

    转载于:https://www.cnblogs.com/Leo-JAM/p/10079269.html

    展开全文
  • 3168: [Heoi2013]钙铁锌硒维生素 题意:给个线性无关A,再给个B,要为A中每个向量在B中选个可以代替的向量,替换后仍然线性无关。判断可行和求字典序最小的解 ...可是A并不是每位独立,怎么求表示啊...

    3168: [Heoi2013]钙铁锌硒维生素

    题意:给一个线性无关组A,再给一个B,要为A中每个向量在B中选一个可以代替的向量,替换后仍然线性无关。判断可行和求字典序最小的解


    PoPoQQQ orz

    显然是一个二分图匹配的模型

    A是一个线性基,用它把B中每个向量表示出来,那么\(B_i\)可以替换\(A_j\)当且仅当表示\(B_i\)用到了\(A_j\)

    可是A并不是每一位独立,怎么求表示啊?

    A和B可以看成两个矩阵(横向量组)
    \(C*A=B \rightarrow C=B*A^{-1}\)
    \(C_{i,j}=1\)说明表示\(B_i\)用到了\(A_j\),那么\(C^T\)就是这个二分图的邻接矩阵了

    求矩阵的逆

    这里说一种方法,对A进行高斯约当消元,右面的常数列换成单位矩阵。校园后,左面变成了单位矩阵,右面就是\(A^{-1}\)

    二分图匹配字典序最小的解

    求任意一个完美匹配,然后从1到n贪心选择字典序最小的解,方法和hungary类似,但是要比较匹配点和当前点的字典序

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    #include <cmath>
    using namespace std;
    typedef unsigned long long ll;
    const int N=305, P=1e9+7;
    inline int read() {
        char c=getchar(); int x=0, f=1;
        while(c<'0' || c>'9') {if(c=='-')f=-1; c=getchar();}
        while(c>='0' && c<='9') {x=x*10+c-'0'; c=getchar();}
        return x*f;
    }
    
    inline ll Pow(ll a, int b) {
        ll ans=1;
        for(; b; b>>=1, a=a*a%P)
            if(b&1) ans=ans*a%P;
        return ans;
    }
    inline void mod(int &x) {if(x<0) x+=P; else if(x>=P) x-=P;}
    
    int n, g[N][N]; char s[N];
    struct Matrix {
        int a[N][N];
        Matrix(){memset(a, 0, sizeof(a));}
        int* operator [](int x) {return a[x];}
        inline void im() {for(int i=1; i<=n; i++) a[i][i]=1;}
        void print() {for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) printf("%d%c",a[i][j],j==n?'\n':' ');}
    }a, b, c;
    
    Matrix inverse(Matrix a) {
        Matrix c; c.im();
        for(int i=1; i<=n; i++) {
            int r;
            for(r=i; r<=n; r++) if(a[r][i]) break;
            // r != n+1
            if(r!=i) for(int j=1; j<=n; j++) 
                swap(a[i][j], a[r][j]), swap(c[i][j], c[r][j]);
            ll inv = Pow(a[i][i], P-2); 
            for(int j=1; j<=n; j++) 
                a[i][j] = a[i][j]*inv%P, c[i][j] = c[i][j]*inv%P;
            for(int k=1; k<=n; k++) if(k!=i) {
                ll t = a[k][i]%P;
                for(int j=1; j<=n; j++) 
                    mod(a[k][j] -= a[i][j]*t%P), mod(c[k][j] -= c[i][j]*t%P);
            }
        }
        return c;
    }
    Matrix operator *(Matrix a, Matrix b) {
        Matrix c;
        for(int i=1; i<=n; i++)
            for(int k=1; k<=n; k++) if(a[i][k])
                for(int j=1; j<=n; j++) 
                    mod(c[i][j] += (ll)a[i][k]*b[k][j]%P);
        return c;
    }
    
    int vis[N], le[N];
    bool dfs(int u) {
        for(int v=1; v<=n; v++) 
            if(!vis[v] && g[u][v]) {
                vis[v]=1;
                if(!le[v] || dfs(le[v])) {
                    le[v]=u;
                    return true;
                }
            }
        return false;
    }
    bool dfs(int u, int now) {
        for(int v=1; v<=n; v++) 
            if(!vis[v] && g[u][v]) {
                vis[v]=1;
                if(le[v]==now || (le[v]>now && dfs(le[v], now))) {
                    le[v]=u;
                    return true;
                }
            }
        return false;
    }
    int main() {
        freopen("in","r",stdin);
        //freopen("ferrous.in","r",stdin);
        //freopen("ferrous.out","w",stdout);
        n=read();
        for(int i=1; i<=n; i++) 
            for(int j=1; j<=n; j++) a[i][j] = read();
        for(int i=1; i<=n; i++) 
            for(int j=1; j<=n; j++) b[i][j] = read();
        c = b * inverse(a); //puts("c");c.print();
        //Matrix t = a * inverse(a); puts("t"); t.print();
        for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) if(c[i][j]) g[j][i]=1;
        for(int i=1; i<=n; i++) {
            memset(vis, 0, sizeof(vis));
            if(!dfs(i)) {puts("NIE"); return 0;}
        }
        puts("TAK");
        for(int i=1; i<=n; i++) {
            memset(vis, 0, sizeof(vis));
            dfs(i, i);
        }
        for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) if(le[j]==i) printf("%d\n",j);
    }
    展开全文
  • 线性

    2021-01-20 16:59:07
    线性基是什么? 一个原序列能求出至少一组线性基 线性基是一个集合 第一,原序列中的任意一个数都可以通过线性基中的一些数异或得到 第二,线性基中的个数是一定的(取决于原序列,下面会讲...线性基怎么求? d数组代表

    线性基是什么?

    一个原序列能求出至少一组线性基
    线性基是一个集合
    第一,原序列中的任意一个数都可以通过线性基中的一些数异或得到
    第二,线性基中的个数是一定的(取决于原序列,下面会讲)它不会重复
    即线性基中的某些数异或的值不会存在线性基中,或者说线性基中的一些数异或起来不会等于0

    线性基又有什么作用呢?为什么要求线性基?

    用于减少时间复杂度
    线性基的长度大约为log(n)(n为原序列的长度)
    原序列和它的线性基在异或操作这个层面上是等价的
    所以用线性基来代替它的原序列来处理就可以了

    线性基怎么求?

    d数组代表原序列的线性基,x代表原序列中的某个元素
    d[i]表示x在二进制下的最高位的位置位i+1(i从0开始)
    有人会问了
    如果有2个数的x和y的最高位的位置都是i+1怎么办?
    首先d[i]值能存一个值,那么d[i]先存x,那么可以把y变成x^y, 因为x^ (x^y)=y,再存y,如果这时的y的最高位和z的是最高位的位置一样,且z已经被存进去了怎么办?那把再把y变成 y^z,直到y能存进去为止
    那如果把整个d数组都遍历完了都存不进去怎么办?
    说明y不能存进去,也就是说如果把y存进去,线性基会出现一些数异或得到0的情况,就会重复,即这个y可以通过已有的线性基中的一些数异或得到
    下面是代码

    void insert(ll x){
    	for(int i=62;i>=0;i--)
    	if(x&(1ll<<i))
    	{
    		if(d[i])x^=d[i];
    		else
    		{
    			d[i]=x;
    			return;
    		}
    	}
    	f=1;//标记有没有不能存进去的数
    }
    

    下面是关于线性基的一些应用
    求在一个序列中,取若干个数,使得它们的异或和最大

    ll getmax(){
    	ll ans=0;
    	for(int i=62;i>=0;i--)
    	if(ans^d[i]>ans)ans^=d[i];
    	return ans;
    }
    

    求最小

    ll getmin(){
    	if(f)return 0;
    	for(int i=0;i<=62;i++)
    	if(d[i])return d[i];
    }
    

    求第k小的值
    从一个序列中取任意个元素进行异或,求能异或出的所有数字中第k小的那个
    我们先来看一下
    a1=1 0 1 0 0, a2=1 1 1 0 0
    ----b=1 1 1 1, -------b=1 1 1 1
    a1异或b会得到比a1大的数,而a2异或b会得到比a2小的数
    只要a的第4位(b的最高位的位置为4)为0那么a异或b的值一定大于a
    那么我们需要重组一个线性基使他们变成这样
    在这里插入图片描述
    那么得到的d数组中的任意2个数异或都会变大
    d[0]<d[1]<d[2]<d[3]<…
    最小的数为d[0];
    第二小的数为d[1];
    第三小的数为d[0]^d[1];
    第四小的数为d[2];
    第五小的数为d[0]^d[2]
    以此类推能得到如果k=10110;
    那么第k小的数为d[1]^d[2] ^d[4];
    代码

    void rebuild(){
    	for(int i=62;i>=1;i--)
    	for(int j=i-1;j>=0;j--)
    	if(d[i]&(1ll<<j))d[i]^=d[j];
    	for(int i=0;i<=62;i++)
    	if(d[i])p[cnt++]=d[i];
    }
    ll getkth(ll k){
    	if(f)--k;
    	if(!k)return 0;
    	if(k>=(1ll<<cnt))return -1;
    	ll ans=0;
    	for(int i=0;i<cnt;i++)
    	if(k&(1ll<<i))ans^=p[i];
    	return ans;
    }
    

    P4570 [BJWC2011]元素

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    ll d[100],sum;
    int t;
    struct node{
    	ll n,m;
    }a[2000];
    bool cmp(node x,node y)
    {
    	return x.m>y.m;
    }
    bool insert(ll x)
    {
    	for(int i=62;i>=0;i--)
    	if(x&(1ll<<i))
    	{
    		if(d[i])x^=d[i];
    		else{d[i]=x;return 1;}
    	}
    	return 0;
    }
    int main()
    {
    	scanf("%d",&t);
    	for(int i=0;i<t;i++)scanf("%lld%lld",&a[i].n,&a[i].m);
    	sort(a,a+t,cmp);
    	for(int i=0;i<t;i++)if(insert(a[i].n))sum+=a[i].m;
    	cout<<sum<<endl;
    	return 0;
    }
    

    P3857 [TJOI2008]彩灯

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int mod=2008;
    ll d[200];
    int n,m,cnt;
    string s;
    void insert(ll x)
    {
    	for(int i=62;i>=0;i--)
    	{
    		if(x&(1ll<<i))
    		{
    			if(d[i])x^=d[i];
    			else{d[i]=x;return;}
    		}
    	}
    }
    void rebuild()
    {
    	for(int i=62;i>=1;i--)
    	for(int j=i-1;j>=0;j--)
    	if(d[i]&(1ll<<j))d[i]^=d[j];
    	for(int i=0;i<=62;i++)
    	if(d[i])cnt++;
    }
    int main()
    {
    	scanf("%d%d",&n,&m);
    	for(int i=0;i<m;i++)
    	{
    		cin>>s;
    		ll a=0;
    		for(int j=0;j<n;j++)
    		{
    			a<<=1;
    			if(s[j]=='O')a++;
    		}
    		insert(a);
    	}
    	rebuild();
    	cout<<(1ll<<cnt)%mod<<endl;
    	return 0;
    }
    

    nowcoder牛牛数数
    用个二分求这个数是不是大于k,找到第一个大于k的位置
    再减一下就能得到答案

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int N=1e5+10;
    ll d[100],p[100],k,a;
    int n,cnt;
    bool f=0;
    void insert(ll x){
    	for(int i=62;i>=0;i--)
    	if(x&(1ll<<i))
    	{
    		if(d[i])x^=d[i];
    		else{d[i]=x;return;}
    	}
    	f=1;
    }
    void rebuild(){
    	for(int i=62;i>=1;i--)
    	for(int j=i-1;j>=0;j--)
    	if(d[i]&(1ll<<j))d[i]^=d[j];
    	for(int i=0;i<=62;i++)
    	if(d[i])p[cnt++]=d[i];
    }
    ll getkth(ll k){
    	if(f)--k;
    	if(!k)return 0;
    	if(k>=(1ll<<cnt))return -1;
    	ll ans=0;
    	for(int i=0;i<cnt;i++)
    	if(k&(1ll<<i))ans^=p[i];
    	return ans;
    }
    int main()
    {
    	scanf("%d%lld",&n,&k);
    	for(int i=1;i<=n;i++)scanf("%lld",&a),insert(a);
    	rebuild();
    	ll l=1,r=(1ll<<cnt)+f-1;
    	while(l<r)
    	{
    		ll m=l+r>>1;
    		if(getkth(m)>k)r=m;
    		else l=m+1;
    	}
    	cout<<(1ll<<cnt)-l+f<<endl;//由于线性基得不到0所以f用来表示0存不存在
    	return 0;
    }
    
    展开全文
  • 大致题意:个图,所有三元(u,v,s),表示从u走到v的条路径,异或和为s。让你所有三元的s的和。相当于任意两点之间所有路径的异或和之和。 之前我们做过BZOJ 2115,大致已经知道了在图上找异或和怎么...
  • 思路:首先集合内异或和,这是线性个明显标志,然后我们不管怎么样先A,秩为r 我们枚举外的数,每个数的贡献是 2^(n-r-1) ,为什么呢,因为其余数我都可以选择选或不选,无论什么组合,我都可以...
  • 线性相关/线性

    2019-10-04 20:22:51
    我们有些时候会遇到类似这样的问题:给定一组数字,异或和最大值。 我们可以用线性来解决这个问题。 怎么构建线性呢 那么我们怎么考虑这个问题呢? 我们可以类比于向量。 在向量中,我们可以用单位向量...
  • 先不考虑重复数字的问题,如果要求数字Q的出现位置的话,首先一个比较直观的想法是,如果能出这样一组基底,它从小到大排序以后可以满足:设只选i向量构造出来的数字为R,那么1..i-1的这些向量不管怎么选,构造...
  • 给你个长度为n的序列,在其中任选数字可以得到的最大异或和。我们知道任意两个,和连续段的最大异或和,可以用Trie加贪心水掉,但这道题怎么做呢?线性就可以用来处理这个玩意。通俗的讲:线性其实是一些...
  • 这题其实挺经典的,看到异或最大,显然想到的是线性...因为线性求一组极大线性无关组,所以查询a[i]^k组成的线性等价于查询k∪a[i]。 #include<bits/stdc++.h> #define lson l,mid,rt<<1...
  • 但直接上线性基求一组的答案是行不通的,原因之后会说。 注意到如果二进制中某一位\(1\)的个数出现了奇数次,那么无论怎么分,都会有一组中这位为\(1\);对于出现偶数次的位,两组中该位都可以有\(1\),或者都没有...
  • 题目链接 分析: 首先有个小技巧,是本题的关键: 任意条111到nnn的路径的异或和,都可以由任意条111到nnn路径的异或和与图中的一些环的异或和来组合得到 这个怎么理解呢 ?...出线性,里面存...
  • 线性方程

    2020-07-09 17:34:05
    基础解系:解空间的一组基,通解就是基础解系的线性形式 k1ξ1+k2ξ2+....+ksξsk_1\xi_1+k_2\xi_2+....+k_s\xi_sk1​ξ1​+k2​ξ2​+....+ks​ξs​ 怎么求基础解系?行最简形(介于梯形和标准形之间,要求每行的...
  • 傅里叶级数

    2019-07-23 20:13:28
    从线性代数的角度来看,线性空间中的任意...因为单位坐标一组标准正交,所以你只要计算被表示向量与向量的内积,就能得到相应的系数,想象下力的分解与合成。否则常规做法是求解线性方程组。 现在就可以从...
  • 这样很好证明:若存在一组向量线性相关,那么肯定是删掉权值最大的那个向量最优。那么按权值从小到大插入时只要发现当前待插入向量与原向量集线性相关就不插入。 怎么维护向量集?类似线性的方法维护即可。 此题...
  • 3.2.4 如果系综相对于自相关是平稳的,一组图像的系综自相关矩阵的形式是怎么样的? 154 3.2.5 如何根据一幅图像的矢量表达,从1-D 自相关函数得到其2-D 自相关矩阵? 155 3.2.6 如何能变换图像使其自相关矩阵...
  • 1.18 我有这样一组声明:typedef char *charp; const charp p; 为什么是p而不是它指向的字符为const? 39 1.19 为什么不能像下面这样在初始式和数组维度值中使用const值?const int n=5; int a[n]; 39 1.20 const ...
  • 1.18 我有这样一组声明:typedef char *charp; const charp p; 为什么是p而不是它指向的字符为const? 39 1.19 为什么不能像下面这样在初始式和数组维度值中使用const值?const int n=5; int a[n]; 39 1.20 const ...
  • 你必须知道的495个C语言问题

    千次下载 热门讨论 2015-05-08 11:09:25
    1.18 我有这样一组声明:typedefchar*charp;constcharpp;为什么是p而不是它指向的字符为const? 1.19 为什么不能像下面这样在初始式和数组维度值中使用const值?constintn=5;inta[n]; 1.20 constchar*p、char...
  • 1.18 我有这样一组声明:typedefchar*charp;constcharpp;为什么是p而不是它指向的字符为const?  1.19 为什么不能像下面这样在初始式和数组维度值中使用const值?constintn=5;inta[n];  1.20 constchar*p、char...
  • const限定词 1.18 我有这样一组声明:typedefchar*charp;constcharpp;为什么是p而不是它指向的字符为const? 1.19 为什么不能像下面这样在初始式和数组维度值中使用const值?constintn=5;inta[n]; 1.20 const...
  •  1.18 我有这样一组声明:typedef char *charp; const charp p; 为什么是p而不是它指向的字符为const?  1.19 为什么不能像下面这样在初始式和数组维度值中使用const值?const int n=5; int a[n];  1.20 const ...
  • 1.18 我有这样一组声明:typedef char *charp; const charp p; 为什么是p而不是它指向的字符为const? 1.19 为什么不能像下面这样在初始式和数组维度值中使用const值?const int n=5; int a[n]; 1.20 const char *p...

空空如也

空空如也

1 2
收藏数 39
精华内容 15
关键字:

一组基怎么求