线性代数一之矩阵转向量随机化求解——神奇的矩阵(BZOJ)+向量内积

向量随机化

  • 神奇的矩阵
    • description
    • solution
    • code
  • [NOI2013]向量内积
    • description
    • solution
    • code

矩阵既可以看成是一张数位表,也可以看成是若干个行向量或者若干个列向量的向量表

在这里插入图片描述

神奇的矩阵

description

solution

暴力做A∗BA*BAB会达到n3n^3n3的复杂度,难以接受

考虑,如果对于矩阵A,B,CA,B,CA,B,C满足A∗B=CA*B=CAB=C,显然有A∗B∗R=C∗RA*B*R=C*RABR=CR

于是有随机一个1×n1\times n1×n的向量RRR,然后check等式是否成立,A∗R∗BA*R*BARB就会降成n2n^2n2的复杂度

随机多次都无法满足这个式子,A∗B=CA*B=CAB=C的概率就微乎其微(除非你是非酋)

code

#include <bits/stdc++.h>
using namespace std;
#define int long long
int n;struct matrix {int n, m;int c[1000][1000];matrix() {memset( c, 0, sizeof( c ) );}matrix operator * ( matrix &t ) {matrix ans;ans.n = n, ans.m = t.m;for( int i = 0;i <= n;i ++ )for( int j = 0;j <= t.m;j ++ )for( int k = 0;k <= m;k ++ )ans.c[i][j] += c[i][k] * t.c[k][j];return ans;}
}A, B, C, R, ans1, ans2;signed main() {srand( time( 0 ) );next :while( ~ scanf( "%lld", &n ) ) {n --;A.n = A.m = B.n = B.m = C.n = C.m = n;for( int i = 0;i <= n;i ++ )for( int j = 0;j <= n;j ++ )scanf( "%lld", &A.c[i][j] );for( int i = 0;i <= n;i ++ )for( int j = 0;j <= n;j ++ )scanf( "%lld", &B.c[i][j] );for( int i = 0;i <= n;i ++ )for( int j = 0;j <= n;j ++ )scanf( "%lld", &C.c[i][j] );int t = 30;again :while( t -- ) {R.n = 0, R.m = n;for( int i = 0;i <= n;i ++ )R.c[0][i] = rand();ans1 = R * A * B;ans2 = R * C;for( int i = 0;i <= n;i ++ )if( ans1.c[0][i] != ans2.c[0][i] )goto again;printf( "Yes\n" );goto next;}printf( "No\n" );}return 0;
} 

[NOI2013]向量内积

description

solution

  • k=2

    • 求出矩阵两两内积(mod2)\pmod 2(mod2) ,即Y=A∗ATY=A*A^TY=AAT
    • 接下来就是判断Y=E,EY=E,EY=E,E为全111矩阵(Yi,jY_{i,j}Yi,j代表着AAAiii行向量与ATA^TATjjj列向量也就是原来的AjA_jAj行向量的内积)因为如果全111代表着每两个向量的内积都为1(mod2)1\pmod 21(mod2)
      • 判断方法就是上一题的随机化
      • 只要不等,就会有一个000向量,找到其位置pospospos,最后暴力求每个向量与其的内积是否整除kkk即可
  • k=3,此时Ai,j=0/1/2A_{i,j}=0/1/2Ai,j=0/1/2,不能在使用上述EEE来判断了

    • 转换一下即可,Zi,j=Yi,j2(mod3)Z_{i,j}=Y_{i,j}^2\pmod 3Zi,j=Yi,j2(mod3),有12≡23≡1(mod3)1^2\equiv 2^3\equiv 1\pmod 312231(mod3),只有02≡0(mod3)0^2\equiv 0\pmod3020(mod3)

    • 再次使用EEE来进行判断

    • 问题在于,ZZZYYY每个单项的平方,不是整体的平方,不能使用矩阵快速得到

      • α\alphaα是随机的一个1×n1\times n1×n向量

      • (Z∗α)i=∑j=1nZi,j∗αj=∑j=1nYi,j2∗αj=∑j=1nαj(∑k=1nAi,kAk,jT)2(Z*\alpha)_i=\sum_{j=1}^nZ_{i,j}*\alpha_j=\sum_{j=1}^nY_{i,j}^2*\alpha_j=\sum_{j=1}^n\alpha_j\bigg(\sum_{k=1}^nA_{i,k}A^T_{k,j}\bigg)^2(Zα)i=j=1nZi,jαj=j=1nYi,j2αj=j=1nαj(k=1nAi,kAk,jT)2

        =∑j=1nαj∑k1=1nAi,k1Ak1,jT∗∑j=1nαj∑k2=1nAi,k2Ak2,jT=\sum_{j=1}^n\alpha_j\sum_{k_1=1}^nA_{i,k_1}A^T_{k_1,j}*\sum_{j=1}^n\alpha_j\sum_{k_2=1}^nA_{i,k_2}A^T_{k_2,j}=j=1nαjk1=1nAi,k1Ak1,jTj=1nαjk2=1nAi,k2Ak2,jT

      • 发现可以变为∑k1,k2Ai,k1Ai,k2∗∑j=1nαjAk1,jAk2,jT\sum_{k_1,k_2}A_{i,k_1}A_{i,k_2}*\sum_{j=1}^n\alpha_jA_{k_1,j}A^T_{k_2,j}k1,k2Ai,k1Ai,k2j=1nαjAk1,jAk2,jT

        预处理出和iii无关部分,设gk1,k2=∑j=1nαjAk1,jAk2,jTg_{k_1,k_2}=\sum_{j=1}^n\alpha_jA_{k_1,j}A^T_{k_2,j}gk1,k2=j=1nαjAk1,jAk2,jT

code

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define maxn 100005
#define maxd 105
int n, d, k, sum, pos, flag;
int x[maxn][maxd], g[maxn][maxd];
int ret[maxd], r[maxn];void calc2() {for( int i = 1;i <= d;i ++ ) ret[i] = 0;for( int i = 1;i <= d;i ++ )for( int j = 1;j <= n;j ++ )ret[i] = ( ret[i] + r[j] * x[j][i] ) % k;for( int i = 1;i <= n;i ++ ) {int ans = 0;for( int j = 1;j <= d;j ++ )ans = ( ans + ret[j] * x[i][j] ) % k;if( ans != sum ) {pos = i, flag = 1;break;}}
}void calc3() {for( int k1 = 1;k1 <= d;k1 ++ )for( int k2 = 1;k2 <= d;k2 ++ ) {g[k1][k2] = 0;for( int j = 1;j <= n;j ++ )g[k1][k2] = ( g[k1][k2] + r[j] * x[j][k1] % k * x[j][k2] ) % k;}for( int i = 1;i <= n;i ++ ) {int ans = 0;for( int k1 = 1;k1 <= d;k1 ++ )for( int k2 = 1;k2 <= d;k2 ++ )ans = ( ans + x[i][k1] * x[i][k2] % k * g[k1][k2] ) % k;if( ans != sum ) {pos = i, flag = 1;break;}}
}signed main() {srand( time( 0 ) );scanf( "%lld %lld %lld", &n, &d, &k );for( int i = 1;i <= n;i ++ )for( int j = 1;j <= d;j ++ )scanf( "%lld", &x[i][j] );	for( int T = 1;T <= 6;T ++ ) {sum = 0;for( int i = 1;i <= n;i ++ )r[i] = rand() % k, sum = ( sum + r[i] ) % k;if( k == 2 ) calc2();else calc3();if( flag ) break;}if( ! flag ) return ! printf( "-1 -1\n" );else {for( int i = 1;i <= n;i ++ )if( i ^ pos ) {int ans = 0;for( int j = 1;j <= d;j ++ )ans = ( ans + x[i][j] * x[pos][j] ) % k;if( ! ans ) return ! printf( "%lld %lld\n", min( i, pos ), max( i, pos ) );}}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317364.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

G - Best ACMer Solves the Hardest Problem Gym - 101955G

G - Best ACMer Solves the Hardest Problem Gym - 101955G 题意&#xff1a; 我们需要建立一个数据库以支持实时查询和修改。这个数据库中的记录是点坐标 (x,y) 和其权值 w。查询与修改操作可以表示为 1 x y w&#xff0c;在 (x,y) 处插入一个新的点&#xff0c;我们保证在…

模板:Link Cut Tree(LCT)

文章目录前言解析原理rotate(x)splay(x)access(x)findroot(x)makeroot(x)split(x,y)link(x,y)cut(x,y)pushdown(x)完整代码所谓Link Cut Tree&#xff0c;就是林可卡特发明的tree &#xff08;逃&#xff09; 前言 终于走到了这一天… 其实感觉没有预想的那么难&#xff08;单…

P6803-[CEOI2020]星际迷航【博弈论,dp,矩阵乘法】

正题 题目链接:https://www.luogu.com.cn/problem/P6803 题目大意 给出一棵nnn个点的树&#xff0c;把它复制出D1D1D1层&#xff0c;编号为[0,D][0,D][0,D]&#xff0c;然后每一层随机一个点向下一层随机一个点连边。 然后从第000层的111号点出发&#xff0c;两个人轮流操作…

潘淳:国士无双《微软技术俱乐部(苏州)成立大会暨微软技术交流会介绍》附专题视频...

题记&#xff1a;凡我赶不上的&#xff0c;我就在未来等他&#xff0c;随时等待捕捉那个趋势的的到来。2019年立一个FLAG&#xff0c;加入一个成长性组织&#xff0c;一个能让我学习使我成长的平台。2019年你和我都将亲历这个组织的到来&#xff0c;一个属于苏州程序员自己的大…

ASP.NET Core中借助CSRedis实现安全高效的分布式锁

引言最近回头看了看开发的.NET Core 2.1项目的复盘总结&#xff0c;其中在多处用到Redis实现的分布式锁&#xff0c;虽然在OnResultExecuting方法中做了防止死锁的处理&#xff0c;但在某些场景下还是会发生死锁的问题&#xff0c;下面我只展示部分代码&#xff1a;问题&#x…

L Machining Disc Rotors

L Machining Disc Rotors 题意&#xff1a; 圆心为(0,0)半径为R的圆&#xff0c;现在被被n个互不相交的圆切割(圆心和半径会给出)&#xff0c;保证这n个彼此之间不会交叉&#xff0c;保证n个圆中不会有某个包含整个大圆的情况。问切割后大圆剩余部分的直径&#xff08;即两点…

线性代数二之矩阵加速DP——数学作业,Arc of Dream

矩阵加速数学作业descriptionsolutioncodeArc of Dreamdescriptionsolutioncode数学作业 description solution dpdpdp状态转移方程&#xff0c;dpidpi−1∗10lenii(modM)dp_{i}dp_{i-1}*10^{len_i}i\pmod Mdpi​dpi−1​∗10leni​i(modM) nnn巨大&#xff0c;分段矩阵加速 …

pjudge#21655-[PR #5]双向奔赴【状压dp】

正题 题目链接:http://pjudge.ac/contest/951/problem/21655 题目大意 给出一张nnn个点的简单无向图&#xff0c;每条边的两个方向具有不同权值。求一个权值和最小的定向方案使得整张图强连通。 1≤n≤18,−1≤ai,j≤1061\leq n\leq 18,-1\leq a_{i,j}\leq 10^61≤n≤18,−1≤…

YBTOJ洛谷P2387: 魔法森林(LCT)

解析 LCT从板子到算法的入门题吧 有一些不知道的很实用的技巧 把边按a排序从小到大加入边 那么我们只需要维护当前1-n路径上的b的最小值即可 如果这条边两端点本来不连通&#xff0c;就直接link 否则找到路径上b最大的一条边&#xff0c;断掉&#xff0c;再加入当前边&#x…

Shadow Properties之美(二)【Microsoft Entity Framework Core随笔】

接着上一篇Shadow Properties之美&#xff08;一&#xff09;&#xff0c;我们来继续举一个有点啰嗦的栗子。先看简单需求&#xff1a;某HR系统&#xff0c;需要记录员工资料。需要记录的资料有&#xff1a;员工号&#xff08;规则&#xff1a;分公司所在城市拼音首字母&#x…

K - Let the Flames Begin

K - Let the Flames Begin 题意&#xff1a; n个人围成一个环&#xff0c;编号分别是1~n&#xff0c;从第一个人开始报数&#xff0c;报道k的人被移除&#xff0c;然后下一个人从1重新报&#xff0c;一直这样进行。问第m给被移除的人报数是多少&#xff1f; 一共T组数据&…

CF1276F-Asterisk Substrings【SAM,线段树合并】

正题 题目链接:https://www.luogu.com.cn/problem/CF1276F 题目大意 给出一个长度为nnn的字符串SSS&#xff0c;现在依次进行如下操作 取出SSS的一个子串TTT。将TTT中的一个字符替换成∗*∗号&#xff08;也可以不替换&#xff09; 求最后有多少种不同的TTT。 解题思路 发…

线性代数三之状压DP的矩阵加速——Quad Tiling,Bus公交线路

状压与矩阵加速的藕断丝连Quad Tilingdescriptionsolutioncode[Hnoi2010]Bus 公交线路descriptionsolutioncodeQuad Tiling description solution 设dpi,S:dp_{i,S}:dpi,S​: iii列的状态为SSS的方案数&#xff0c;最后答案为dpn,(1<<4)−1dp_{n,(1<<4)-1}dpn,(…

codeforces:812(div2):总结

前言 比较水的一场比赛 E题几乎是一本通原题而我还是不会做qwq A - Sagheer and Crossroads 有一个十字路口&#xff0c;给出四个路口的车是否可以左转/右转/直行&#xff0c;并且给出每个路口的行人是否可以通过&#xff0c;求是否出现车和人冲突的情况 阅读理解题&#xff…

如何在ASP.NET Core程序启动时运行异步任务(2)

原文&#xff1a;Running async tasks on app startup in ASP.NET Core (Part 2)作者&#xff1a;Andrew Lock译者&#xff1a;Lamond Lu在我的上一篇博客中&#xff0c;我介绍了如何在ASP.NET Core应用程序启动时运行一些一次性异步任务。本篇博客将继续讨论上一篇的内容&…

Gym 102798A Golden Spirit

VJ链接 题意&#xff1a; 河的两岸各有n个人&#xff0c;中间有个桥&#xff0c;过桥时间为t&#xff0c;所有人过桥后要休息x时间&#xff0c;你每次可以带一个人过桥&#xff08;每次最多只能带一个人&#xff09;&#xff0c;问将所有人带到对岸并带回来&#xff0c;最短需…

P8347-「Wdoi-6」另一侧的月【博弈论,结论】

正题 题目链接:https://www.luogu.com.cn/problem/P8347 题目大意 给出一棵树&#xff0c;两个人轮流操作。 操作者可以选择一个点删除&#xff0c;然后选择一个剩下的连通块&#xff0c;删除其他连通块。 操作完成后只剩下一个点的人失败&#xff0c;求是否先手必败。 1≤…

线性代数四之动态DP(广义矩阵加速)——Can you answer these queries III,保卫王国

动态DP——广义矩阵加速SP1716 GSS3 - Can you answer these queries IIIdescriptionsolutioncode[NOIP2018 提高组] 保卫王国descriptionsolutioncode动态DP能矩阵加速要满足外层操作符对内层操作符具有分配率加法对于乘法就具有分配率(ab)*ca*cb*c SP1716 GSS3 - Can you a…

洛谷P4219 大融合(LCT、虚子树)

解析 本题需要用LCT维护子树大小 然后我就不会了 然后我就用树剖水过去了 又快又好写&#xff0c;真香 现在详细聊聊如何用LCT维护子树信息 每个结点再定义一个新的变量记录所有虚儿子的信息 然后…完了&#xff1f; 告别盲目pushup&#xff0c;我们来详细聊聊在哪里需要更新…

.Net Core跨平台应用研究-HelloArm(串口篇)

引言为了验证采用dotnet core技术开发的物联网设备数据采集接入服务应用是否能在高性价比的linux嵌入式平台运行&#xff0c;针对dotnet core应用程序进行嵌入式linux环境的发布部署运行验证研究。硬件环境硬件系统经过对比筛选&#xff0c;选用了友善之臂出品的NanoPC-T3 Plus…