题解-洛谷P8110 [Cnoi2021]矩阵

P8110 [Cnoi2021]矩阵




题解

  • 分析

    以样例1为例:

    3 0
    1 2 3
    4 5 6
    

    根据题意,Aij=ai×bj,很容易得到:

    A=[45681012121518]

    诶,有没有发现一个特殊的性质?

    矩阵A的行和列线性相关!!!

    从而,矩阵A的秩r(A)=1,于是有一个结论

    Ak=tr(A)k1A

    其中,tr(A)称为矩阵A的迹,即A的主对角线上的元素之和(在这里即i=1naibi

    那么,此题已解。

    Ans=tr(A)k1i=1nj=1nAij=(i=1naibi)k1i=1nj=1naibj=(i=1naibi)k1i=1naij=1nbj=(i=1naibi)k1(i=1nai)(j=1nbj)

    快速幂处理(i=1naibi)k1即可

    时间复杂度:O(n+logk)

  • 代码

    #include<iostream>
    #include<cstdio>
    #define ll long long
    #define maxn 100010
    #define P(x) ((((x)%p)+p)%p)
    
    using namespace std;
    
    ll n,k,p=998244353,a[maxn],b[maxn],ans,mula,mulb,mulab;
    
    template<typename type>
    inline void read(type &x)
    {
        x=0;bool flag(0);char ch=getchar();
        while(!isdigit(ch)) flag^=ch=='-',ch=getchar();
        while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
        flag?x=-x:0;
    }
    
    template<typename type>
    inline void write(type x,bool mode)
    {
        x<0?x=-x,putchar('-'):0;static short Stack[50],top(0);
        do Stack[++top]=x%10,x/=10;while(x);
        while(top) putchar(Stack[top--]|48);
        mode?putchar('\n'):putchar(' ');
    }
    
    inline ll ksm(ll x,ll y)
    {
        ll res=1;
        while(y)
        {
            if(y&1) res=P(res*x);
            x=P(x*x);
            y>>=1;
        }
        return res;
    }
    
    signed main()
    {
        read(n),read(k);
        for(int i=1;i<=n;i++) read(a[i]),a[i]=P(a[i]),mula=P(mula+a[i]);
        for(int i=1;i<=n;i++) read(b[i]),b[i]=P(b[i]),mulb=P(mulb+b[i]),mulab=P(mulab+P(a[i]*b[i]));
        if(!k) {write(n,1);return 0;}
        ans=P(mula*mulb)*P(ksm(mulab,k-1));
        write(P(ans),1);
        return 0;
    }
    
    
  • 说明

    在线性代数里,矢量空间的一组元素中,若没有矢量可用有限个其他矢量的线性组合所表示,则称为线性无关或线性独立(linearly independent),反之称为线性相关(linearly dependent)。

    「链接:百度百科-线性相关

    简洁来说,你可以把一个矩阵看作一个变换,矩阵每一列看作一个向量,如:

    A=[45681012121518]

    可以看作[4812]​,[51015]​,[61218]​这三个描述变换的向量在作用到原空间后形成的空间,由于一共有三列,故有三个坐标,这些向量位于三维空间,它们的作用可以描述为:将基向量[100][010][001]分别移到它们所在的坐标。

    观察发现,[4812][51015][61218]这三个向量是共线的,因此整个三维空间在被它们作用后塌缩为一条直线(一维),因此矩阵A的秩「也就是A的线性无关的列(或行)的最大数目,即1」为1

    已知一个n×n矩阵A的秩为1,则A的所有列向量/行向量线性相关,此时由于这三个向量是成比例关系的,因此可以根据矩阵乘法的定义,将A拆解为一个n×1的矩阵B和一个1×n的矩阵C的乘积。

    以上面的矩阵A为例:

    A=[45681012121518]=[123]×[456]

    B=[123],C=[456],则A=B×C​​

    因此:

    An=(B×C)n=B×C×B×C...B×C=B×(C×B)×(C×B)...×C=B×(C×B)n1×C

    我们知道,一个1×n的矩阵乘一个n×1的矩阵得到的是一个1×1的矩阵,也就是一个数。

    故:

    C×B=[456]×[123]=4×1+5×2+6×3=32

    我们便愉快地发现:

    An=32n1×B×C=32n1×A

    32不正是矩阵A对角线的元素之和吗?

    证毕。




第一次写题解,如有不足,请谅解~


  1. 关于线性相关 ↩︎

  2. 关于这个结论的推导过程 ↩︎

posted @   凌云_void  阅读(71)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示