Description

两个d 维向量A=[a1,a2,...,ad]与B=[b1,b2,...,bd]的内积为其相对应维度的权值的乘积和,即:



现有 n 个d 维向量x1,...,xn ,小喵喵想知道是否存在两个向量的内积为k的倍数。请帮助她解决这个问题

Solution

首先做一个转换:如果把 \(B=A*A^T\) 构造出来,那么 \(B[i][j]\) 就代表向量 \(i\) 和向量 \(j\) 的内积,如果为 \(\mod k=0\) 则满足要求

\(A^T\) 是转置矩阵,也就是把原矩阵交换行列之后的矩阵

如果 \(k=2\)

我们只需要判断 \(A*A^T\) 是否和全 \(1\) 矩阵相等就行了

判断两个大矩阵相等一般用随机法:

随机一个行向量 \(E\),然后分别乘以两个矩阵判断行向量最后是否相等

行向量乘以矩阵的复杂度是 \(O(n*d)\) 的,所以复杂度就对了,在这个题利用矩乘的分配率 \(E*(A*A^T)=(E*A*)A^T\)

这样一次随机的正确性是 \(0.5\) 的(不会证),多随几次就可以了

\(k=3\)时

由于矩阵中还有可能出现 \(2\) ,我们发现一个性质 \(2^2\mod 3=1\)

所以我们只需要把内积平方一下就可以了,即:

\((\sum_{i=1}^{d}a_i*b_i)*(\sum_{i=1}^{d}a_i*b_i)=\sum_{i=1}^{d}\sum_{j=1}^{d}a_i*b_i*a_j*b_j\)

相当于是构造出了一个大小为 \(n*d^2\) 的矩阵,还是像 \(k=2\) 那样做就可以了

#include<bits/stdc++.h>
using namespace std;
const int N=100010,M=110;
int a[N][M],n,m,mod,A[N],B[N],x[N],id[M][M];
inline void check(int x){
for(int i=1;i<=n;i++){
if(x==i)continue;
int s=0;
for(int j=1;j<=m;j++)s+=a[i][j]*a[x][j];
s%=mod;
if(!s)printf("%d %d\n",min(i,x),max(i,x)),exit(0);
}
}
inline void solve(){
int sum=0;
for(int i=1;i<=n;i++)sum=(sum+(x[i]=rand()%mod))%mod;
for(int i=1;i<=m;i++)A[i]=0;
for(int i=1;i<=n;i++)B[i]=0;
for(int j=1;j<=n;j++)
for(int i=1;i<=m;i++)A[i]+=x[j]*a[j][i];
for(int i=1;i<=m;i++)A[i]%=mod;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)B[i]+=A[j]*a[i][j];
for(int i=1;i<=n;i++)B[i]%=mod;
for(int i=1;i<=n;i++)if(B[i]!=sum)check(i);
}
inline void solvet(){
int sum=0,t=0;
for(int i=1;i<=n;i++)sum=(sum+(x[i]=rand()%mod))%mod;
for(int i=1;i<=n;i++)B[i]=0;
for(int i=1;i<=m;i++)
for(int j=1;j<=m;j++)A[id[i][j]=++t]=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
for(int k=1;k<=m;k++)A[id[j][k]]=(A[id[j][k]]+x[i]*a[i][j]*a[i][k])%mod;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
for(int k=1;k<=m;k++)B[i]=(B[i]+A[id[j][k]]*a[i][j]*a[i][k])%mod;
for(int i=1;i<=n;i++)if(B[i]!=sum)check(i);
}
int main(){
freopen("pp.in","r",stdin);
freopen("pp.out","w",stdout);
srand(time(NULL));
scanf("%d%d%d",&n,&m,&mod);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)scanf("%d",&a[i][j]),a[i][j]%=mod;
int T=7;
while(T--)mod==2?solve():solvet();
puts("-1 -1");
return 0;
}

bzoj 3243: [Noi2013]向量内积的更多相关文章

  1. 3243: [Noi2013]向量内积 - BZOJ

    Description 两个d 维向量A=[a1,a2,...,ad]与B=[b1,b2,...,bd]的内积为其相对应维度的权值的乘积和,即: 现有 n 个d 维向量x1,...,xn ,小喵喵想知 ...

  2. 【fake题解】[NOI2013]向量内积

    [fake题解][NOI2013]向量内积 做法1 大暴力.哪里不会T哪里. 做法2 所有数都%=k不影响结果.(废话 k的取值只有2和3,所以肯定是要分类讨论的.k=2肯定简单些啦. k=2 出现的 ...

  3. [Noi2013]向量内积

    来自FallDream的博客,未经允许,请勿转载,谢谢. 两个d 维向量A=[a1,a2,...,ad]与B=[b1,b2,...,bd]的内积为其相对应维度的权值的乘积和,即: $\sum_{i=1 ...

  4. P1224 [NOI2013]向量内积

    传送门 发现这个内积和矩乘有点像,考虑构造一个 $n$ 行 $m$ 列的矩阵 $A$,每一行都是一个题目给定的 $m$ 维向量 设 $B=AA^T$ ,其中 $A^T$ 为 $A$ 的转置矩阵,那么对 ...

  5. luogu P1224 [NOI2013]向量内积

    传送门 挺有意思的一道题 暴力60就是枚举每个向量暴力check,随机选向量就能多骗一些分 然后两个向量内积要模\(k\)为\(0\),那么如果全部不为\(0\)就不合法.先考虑\(k=2\),对于向 ...

  6. BZOJ3243 NOI2013向量内积(随机化)

    考虑奇技淫巧. 首先是k=2.对向量维护一个前缀和,每次将当前向量与前缀和点乘.如果点乘结果不等于i-1&1,说明当前向量至少和之前的某个向量的数量积是2的倍数,暴力找就可以了.当然等于i-1 ...

  7. 【uoj121】 NOI2013—向量内积

    http://uoj.ac/problem/121 (题目链接) 题意 给出${n}$个${d}$维向量,问是否有两个不同的向量的内积是${k}$的倍数. Solution 又卡了一上午常数,我弃了T ...

  8. BZOJ3243/UOJ121 [Noi2013]向量内积

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  9. BZOJ3243 [Noi2013]向量内积 【乱搞】

    题目链接 BZOJ3243 题解 模数只有\(2\)或\(3\),可以大力讨论 如果模数为\(2\),乘积结果只有\(1\)或\(0\) 如果一个向量和前面所有向量乘积都为\(1\),那么其和前面向量 ...

随机推荐

  1. 以太坊系列之十八: 百行go代码构建p2p聊天室

    百行go代码构建p2p聊天室 百行go代码构建p2p聊天室 1. 上手使用 2. whisper 原理 3. 源码解读 3.1 参数说明 3.1 连接主节点 3.2 我的标识 3.2 配置我的节点 3 ...

  2. [转]解读Unity中的CG编写Shader系列3——表面剔除与剪裁模式

    在上一个例子中,我们得到了由mesh组件传递的信息经过数学转换至合适的颜色区间以颜色的形式着色到物体上.这篇文章将要在此基础上研究片段的擦除(discarding fragments)和前面剪裁.后面 ...

  3. xcode工程配置绝对路径与相对路径

    1.问题描述 一般我们在xcode里面配置包含工程目录下头文件的时候,都要关联着相对路径和绝对路径,如果只是自己用这个项目,用绝对路径的问题不大,但是如果你把工程发给别人,别人就要在改这个绝对路径,这 ...

  4. 842. Split Array into Fibonacci Sequence

    Given a string S of digits, such as S = "123456579", we can split it into a Fibonacci-like ...

  5. requests利用selenium,代理Ip,云打码,验证码抠图操作 爬取搜狗微信公众号内容

    爬取思路,爬取搜狗微信公众号内容,爬取第一层url时请求太快出现验证码,我这里用的蘑菇云代理,并在程序中我判断什么情况下是否+代理,做到合理运用代理ip.爬取第二层url时验证码出现次数更严重(和第一 ...

  6. 【bzoj4036】[HAOI2015]按位或 fmt+期望

    Description 刚开始你有一个数字0,每一秒钟你会随机选择一个[0,2^n-1]的数字,与你手上的数字进行或(c++,c的|,pascal 的or)操作.选择数字i的概率是p[i].保证0&l ...

  7. vmware vSphere虚拟网络之标准交换机(二)

    一.标准交换机的特点: 1)只能用于物理主机 2)其他主机不能共享同一个虚拟交换机 3)不具备任何灵活性 4)每台ESXi主机都要配置一遍 二.网络图: 三.创建标准交换机: 登录web vCente ...

  8. CBoard 汉化以及元数据存储配置

    汉化配置如图位置: 元数据存储配置为Mysql数据库的位置 版权声明:本文为博主原创文章,需要转载请注明出处. [置顶]Cboard 系列随笔

  9. php Apache No input file

    RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L] 变为 RewriteRule ^(.*)$ index.php?/$1 [QSA,PT,L]

  10. leetcode 283 Move Zeros; 27 Remove Elements; 26 Remove Duplicated from Sorted Array;

    ,,,,}; //把数组的值赋给vector vector<int> vec(arr, arr+sizeof(arr)/sizeof(int)); 解法一: 时间复杂度O(n) 空间复杂度 ...