2020牛客暑期多校训练营(第一场) D、Quadratic Form (数学,矩阵运算)

该博客介绍了如何利用拉格朗日乘数法解决一个涉及二次型函数和矩阵运算的优化问题。在约束条件下,通过构建拉格朗日函数并求偏导数,找到目标函数取极值时的解。讨论了矩阵的对称性质,并给出了求解过程和最终代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接

题面:
在这里插入图片描述

题意:
给定一些约束条件求目标函数的最大值。
其中 det(A) ≠ 0 (mod 998244353),保证了在 mod 998244353 下矩阵A 可逆。

题解:
没有想明白为什么会在 ∑ i = 1 n ∑ j = 1 n A i , j x i x j = 1 \sum_{i=1}^n\sum_{j=1}^nA_{i,j}x_ix_j=1 i=1nj=1nAi,jxixj=1 的条件下计算目标函数的最大值。

我们假设目标函数为 f ( x 1 , . . . , x n ) = ∑ i = 1 n b i x i f(x_1,...,x_n)=\sum_{i=1}^nb_ix_i f(x1,...,xn)=i=1nbixi,因为最终求的是平方,那么一定在 f f f取极值时,最终答案取极值

约束条件为 g ( x 1 , . . . , x n ) = ∑ i = 1 n ∑ j = 1 n A i , j x i x j = 1 g(x_1,...,x_n)=\sum_{i=1}^n\sum_{j=1}^nA_{i,j}x_ix_j=1 g(x1,...,xn)=i=1nj=1nAi,jxixj=1

拉个朗日函数为 L ( x 1 , . . . , x n , λ ) = ∑ i = 1 n b i x i + λ ( ∑ i = 1 n ∑ j = 1 n A i , j x i x j − 1 ) L(x1,...,xn,\lambda)=\sum_{i=1}^nb_ix_i+\lambda(\sum_{i=1}^n\sum_{j=1}^nA_{i,j}x_ix_j-1) L(x1,...,xn,λ)=i=1nbixi+λ(i=1nj=1nAi,jxixj1)

对L的每个变量求偏导,求偏导的时候 ∑ i = 1 n ∑ j = 1 n A i , j x i x j \sum_{i=1}^n\sum_{j=1}^nA_{i,j}x_ix_j i=1nj=1nAi,jxixj拆开即可。
注意 A i , j = A j , i A_{i,j}=A_{j,i} Ai,j=Aj,i,矩阵A为对称矩阵

{ b 1 + 2 ∗ λ ( A 1 , 1 x 1 + A 1 , 2 x 2 + . . . + A 1 , n x n ) = 0 b 2 + 2 ∗ λ ( A 2 , 1 x 1 + A 2 , 2 x 2 + . . . + A 2 , n x n ) = 0 . . . b n + 2 ∗ λ ( A n , 1 x 1 + A n , 2 x 2 + . . . + A n , n x n ) = 0 ∑ i = 1 n ∑ j = 1 n A i , j x i x j = 1 \begin{cases} b1+2*\lambda(A_{1,1}x_1+A_{1,2}x_2+...+A_{1,n}x_n)=0\\b2+ 2*\lambda(A_{2,1}x_1+A_{2,2}x_2+...+A_{2,n}x_n)=0\\.\\.\\.\\bn+ 2*\lambda(A_{n,1}x_1+A_{n,2}x_2+...+A_{n,n}x_n)=0\\\sum_{i=1}^n\sum_{j=1}^nA_{i,j}x_ix_j=1\\\end{cases} b1+2λ(A1,1x1+A1,2x2+...+A1,nxn)=0b2+2λ(A2,1x1+A2,2x2+...+A2,nxn)=0...bn+2λ(An,1x1+An,2x2+...+An,nxn)=0i=1nj=1nAi,jxixj=1


{ B + 2 λ A x = 0 ① x T A x = 1 ② \begin{cases}B+2\lambda Ax=0①\\x^TAx=1②\end{cases} {B+2λAx=0xTAx=1

B + 2 λ A x = 0 B+2\lambda Ax=0 B+2λAx=0----> 2 λ A x = − B 2\lambda Ax=-B 2λAx=B----> x = − A − 1 2 λ ∗ B x=-\dfrac{A^{-1}}{2\lambda}*B x=2λA1B

∑ x i b i = x T B = B T x \sum x_ib_i=x^TB=B^Tx xibi=xTB=BTx----> B T x = B T ( − A − 1 2 λ ∗ B ) = x T B B^Tx=B^T(-\dfrac{A^{-1}}{2\lambda}*B)=x^TB BTx=BT(2λA1B)=xTB----> x T = − B T A − 1 2 λ x^T=-B^T\dfrac{A^{-1}}{2\lambda} xT=BT2λA1

x T A x = 1 x^TAx=1 xTAx=1----> − B T A − 1 2 λ ∗ A ∗ − A − 1 2 λ ∗ B = 1 -B^T\dfrac{A^{-1}}{2\lambda}*A*-\dfrac{A^{-1}}{2\lambda}*B=1 BT2λA1A2λA1B=1----> 1 4 λ 2 B T A − 1 B = 1 \dfrac{1}{4\lambda ^2}B^TA^{-1}B=1 4λ21BTA1B=1

( ∑ B T x ) 2 = ( − 1 2 λ B T A − 1 B ) 2 = 1 4 λ 2 ( B T A − 1 B ) ( B T A − 1 B ) = ( B T A − 1 B ) (\sum B^Tx)^2=(-\dfrac{1}{2\lambda}B^TA^{-1}B)^2=\dfrac{1}{4\lambda ^2}(B^TA^{-1}B)(B^TA^{-1}B)=(B^TA^{-1}B) (BTx)2=(2λ1BTA1B)2=4λ21(BTA1B)(BTA1B)=(BTA1B)

求解 B T A − 1 B B^TA^{-1}B BTA1B即可。

代码:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<string>
#include<queue>
#include<bitset>
#include<map>
#include<unordered_map>
#include<set>
#define ui unsigned int
#define ll long long
#define llu unsigned ll
#define ld long double
#define pr make_pair
#define pb push_back
#define lc (cnt<<1)
#define rc (cnt<<1|1)
#define len(x)  (t[(x)].r-t[(x)].l+1)
#define tmid ((l+r)>>1)
using namespace std;
const int inf=0x3f3f3f3f;
const ll lnf=0x3f3f3f3f3f3f3f3f;
const double dnf=1e18;
const int mod=998244353;
const double eps=1e-8;
const double pi=acos(-1.0);
const int hp=13331;
const int maxn=210;
const int maxm=100100;
const int up=100000;

struct node
{
    int n,m;
    int a[maxn][maxn];
    void init(void)
    {
        memset(a,0,sizeof(a));
        for(int i=1;i<=n;i++)
            a[i][i]=1;
    }
    void input(void)
    {
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
                scanf("%d",&a[i][j]);
        }
    }
    void _swap(int x,int y)
    {
        for(int i=1;i<=n;i++)
            swap(a[x][i],a[y][i]);
    }
    void mul_k(int x,int k)
    {
        for(int i=1;i<=n;i++)
            a[x][i]=(ll)a[x][i]*k%mod;
    }
    void mul_k_add(int x,int k,int y)
    {
        for(int i=1;i<=n;i++)
            a[y][i]=((a[y][i]+(ll)a[x][i]*k)%mod+mod)%mod;
    }
    void print(void)
    {
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
                printf("%d ",a[i][j]);
            putchar('\n');
        }
    }
    node getT(void)
    {
        node ans;
        ans.n=m,ans.m=n;
        for(int i=1;i<=m;i++)
        {
            for(int j=1;j<=n;j++)
                ans.a[i][j]=a[j][i];
        }
        return ans;
    }

    node operator * (const node &b) const
    {
        node ans;
        memset(ans.a,0,sizeof(ans.a));
        ans.n=n,ans.m=b.m;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=b.m;j++)
            {
                for(int k=1;k<=m;k++)
                    ans.a[i][j]=(ans.a[i][j]+1ll*a[i][k]*b.a[k][j])%mod;
            }
        }
        return ans;
    }

}a,inva,b,bt,ans;

int mypow(int a,int b)
{
    int ans=1;
    while(b)
    {
        if(b&1) ans=(ll)ans*a%mod;
        a=(ll)a*a%mod;
        b>>=1;
    }
    return ans;
}

void get(node &a,node &b)
{
    b.n=b.m=a.n;
    b.init();
    int n=a.n;
    for(int i=1;i<=n;i++)
    {
        if(!a.a[i][i])
        {
            for(int j=i+1;j<=n;j++)
            {
                if(a.a[j][i])
                {
                    a._swap(i,j);
                    b._swap(i,j);
                    break;
                }
            }
        }

        b.mul_k(i,mypow(a.a[i][i],mod-2));
        a.mul_k(i,mypow(a.a[i][i],mod-2));

        for(int j=i+1;j<=n;j++)
        {
            b.mul_k_add(i,-a.a[j][i],j);
            a.mul_k_add(i,-a.a[j][i],j);
        }
    }
    for(int i=n;i>=1;i--)
    {
        for(int j=i-1;j>=1;j--)
        {
            b.mul_k_add(i,-a.a[j][i],j);
            a.mul_k_add(i,-a.a[j][i],j);
        }
    }
}

int main(void)
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        a.n=n,a.m=n;
        a.input();
        b.n=n,b.m=1;
        b.input();
        get(a,inva);
        printf("%d\n",(b.getT()*inva*b).a[1][1]);
    }

    return 0;
}







在探索智慧旅游的新纪元中,一个集科技、创新与服务于一体的整体解决方案正悄然改变着我们的旅行方式。智慧旅游,作为智慧城市的重要分支,旨在通过新一代信息技术,如云计算、大数据、物联网等,为游、旅游企业及政府部门提供无缝对接、高效互动的旅游体验与管理模式。这一方案不仅重新定义了旅游行业的服务标准,更开启了旅游业数字化转型的新篇章。 智慧旅游的核心在于“以人为本”,它不仅仅关注技术的革新,更注重游体验的提升。从游前的行程规划、信息查询,到游中的智能导航、个性化导览,再到游后的心情分享、服务评价,智慧旅游通过构建“一云屏”的服务平台,让游在旅游的全过程中都能享受到便捷、个性化的服务。例如,游可以通过手机APP轻松定制专属行程,利用智能语音导览深入了解景点背后的故事,甚至通过三维GIS地图实现虚拟漫游,提前感受目的地的魅力。这些创新服务不仅增强了游的参与感和满意度,也让旅游变得更加智能化、趣味化。 此外,智慧旅游还为旅游企业和政府部门带来了前所未有的管理变革。通过大数据分析,旅游企业能够精准把握市场动态,实现旅游产品的精准营销和个性化推荐,从而提升市场竞争力。而政府部门则能利用智慧旅游平台实现对旅游资源的科学规划和精细管理,提高监管效率和质量。例如,通过实时监控和数据分析,政府可以迅速应对旅游高峰期的流压力,有效预防景区超载,保障游安全。同时,智慧旅游还促进了跨行业、跨部门的数据共享与协同合作,为旅游业的可持续发展奠定了坚实基础。总之,智慧旅游以其独特的魅力和无限潜力,正引领着旅游业迈向一个更加智慧、便捷、高效的新时代。
内容概要:本文详细介绍了大模型的发展现状与未来趋势,尤其聚焦于DeepSeek这一创新应用。文章首先回顾了人工智能的定义、分类及其发展历程,指出从摩尔定律到知识密度提升的转变,强调了大模型知识密度的重要性。随后,文章深入探讨了DeepSeek的发展路径及其核心价值,包括其推理模型、思维链技术的应用及局限性。此外,文章展示了DeepSeek在个行业的应用场景,如智能服、医疗、金融等,并分析了DeepSeek如何赋能个人发展,具体体现在公文写作、文档处理、知识搜索、论文写作等方面。最后,文章展望了大模型的发展趋势,如通用大模型与垂域大模型的协同发展,以及本地部署小模型成为主流应用渠道的趋势。 适合人群:对人工智能和大模型技术感兴趣的从业者、研究人员及希望利用DeepSeek提升工作效率的个人用户。 使用场景及目标:①了解大模型技术的最新进展和发展趋势;②掌握DeepSeek在不同领域的具体应用场景和操作方法;③学习如何通过DeepSeek提升个人在公文写作、文档处理、知识搜索、论文写作等方面的工作效率;④探索大模型在特定行业的应用潜力,如医疗、金融等领域。 其他说明:本文不仅提供了理论知识,还结合实际案例,详细介绍了DeepSeek在各个场景下的应用方式,帮助读者更好地理解和应用大模型技术。同时,文章也指出了当前大模型技术面临的挑战,如模型的局限性和数据安全问题,鼓励读者关注技术的持续改进和发展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值