#2664. 「NOI2013」向量内积

两个 \(d\) 维向量 \(A=[a_1, a_2 ,...,a_d]\) 与 \(B=[b_1 ,b_2 ,...,b_d]\) 的内积为其相对应维度的权值的乘积和,即:

\[(A,B) = \displaystyle \sum_{i=1}^d{a_ib_i} = a_1b_1 + a_2b_2 + \ldots + a_db_d
\]

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


输入格式

第一行包含 \(3\) 个正整数 \(n,d,k\),分别表示向量的个数、维数以及待检测的倍数。

接下来 \(n\) 行每行有 \(d\) 个非负整数,其中第 \(i\) 行的第 \(j\) 个整数表示向量 \([x_i]\) 的第 \(j\) 维权值 \(x_{i,j}\)。

输出格式

包含两个整数,用空格隔开。

如果存在两个向量 \(x_p,x_q\) 的内积为 \(k\) 的整数倍,则输出两个向量的编号 \(p\) 与 \(q\)(要求 \(p<q\))。如果存在多组这样的向量组合,输出其中任意一组即可。

若不存在这样的向量组合,则输出两个 \(−1\)。


数据范围与提示

测试点编号 n d k \(x_i\)
\(1\) \(2\) \(20\) \(2\) \(\le 10\)
\(2\) \(5\) \(20\) \(2\) \(\le 10\)
\(3\) \(10\) \(20\) \(3\) \(\le 10\)
\(4\) \(20\) \(20\) \(2\) \(\le 100\)
\(5\) \(50\) \(20\) \(3\) \(\le 100\)
\(6\) \(50\) \(50\) \(2\) \(\le 1000\)
\(7\) \(50\) \(50\) \(3\) \(\le 3000000\)
\(8\) \(80\) \(80\) \(2\) \(\le 2000000\)
\(9\) \(100\) \(100\) \(3\) \(\le 3000000\)
\(10\) \(500\) \(100\) \(3\) \(\le 3000000\)
\(11\) \(1000\) \(100\) \(2\) \(\le 2000000\)
\(12\) \(1000\) \(100\) \(3\) \(\le 3000000\)
\(13\) \(10000\) \(100\) \(2\) \(< 10\)
\(14\) \(10000\) \(100\) \(3\) \(< 10\)
\(15\) \(15000\) \(100\) \(2\) \(< 10\)
\(16\) \(18000\) \(100\) \(2\) \(< 10\)
\(17\) \(20000\) \(100\) \(2\) \(< 10\)
\(18\) \(50000\) \(30\) \(3\) \(< 10\)
\(19\) \(80000\) \(30\) \(3\) \(< 10\)
\(20\) \(100000\) \(30\) \(3\) \(< 10\)

向量点乘的过程有点像一个行向量和一个列向量相乘,然后我们把原始向量排成一个矩阵\(A\),然后令\(D=A*A^T\)。

那么\(D_{i,j}\)就代表向量\(i\)和向量\(j\)做内积。

突破口在\(\bmod 2\)上。

现在矩阵所有元素在\(\bmod 2\)下

我们设一个\(n\times n\)的全\(1\)矩阵\(E\),然后通过一些随机化的方法比较\(D\)和\(E\)有哪里不相等。

我们可以随机几个\(1\times n\)的向量\(C\),然后判断是否有

\[C\times A\times A^T\equiv C\times E\pmod 2
\]

并且我们可以判断出哪一行不相等,然后可以暴力枚举与之匹配的另一个。

或者随机一下原始向量的排列顺序。

至于为什么随机次数是常数次,可以从Hash的角度感性理解

然后\(\bmod 3\)也差不多

注意到\(2^2\equiv 1\pmod 3,1^2\equiv 1\pmod 3\),我们把矩阵\(D'_{i,j}=D^2_{i,j}\)搞出来就可以了

把这个式子拆开可以发现我们需要把组成\(A\)的每一个向量搞出\(1\times d^2\)的,即\(A'_{i,(j-1)d+k}=A_{i,j}*A_{i,k}\)

然后和\(2\)是一样的


Code:

#include <cstdio>
#include <cstring>
#include <cctype>
#include <cstdlib>
#include <algorithm>
int read()
{
int x=0;char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) x=x*10+c-'0',c=getchar();
return x;
}
int n,d,k;
namespace beecute
{
int yuy[20010][110],bee[110],dew[20010],c[20010];
void work()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=d;j++)
yuy[i][j]=read()&1;
int Dew=5;
while(Dew--)
{
memset(dew,0,sizeof dew);
memset(bee,0,sizeof bee);
for(int i=1;i<=n;i++) c[i]=rand()&1;
for(int i=1;i<=d;i++)
for(int j=1;j<=n;j++)
if(c[j])
bee[i]=bee[i]+yuy[j][i]&1;
for(int i=1;i<=n;i++)
for(int j=1;j<=d;j++)
dew[i]=(dew[i]+bee[j]*yuy[i][j])&1;
for(int i=1;i<=n;i++)
if(dew[i]!=c[i])
{
for(int j=1;j<=n;j++)
{
int sum=0;
for(int k=1;k<=d;k++)
sum=(sum+yuy[i][k]*yuy[j][k])&1;
if(!sum)
{
if(i<j) printf("%d %d\n",i,j);
else printf("%d %d\n",j,i);
return;
}
}
}
}
puts("-1");
}
}
namespace beelovely
{
int yuy[100010][101],bee[10010],dew[100010],c[100010];
void work()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=d;j++)
yuy[i][j]=read()%3;
for(int i=1;i<=d;i++)
for(int j=1;j<=d;j++)
for(int k=1;k<=n;k++)
(bee[(i-1)*d+j]+=yuy[k][i]*yuy[k][j])%=3;
int Dew=5;
while(Dew--)
{
memset(dew,0,sizeof dew);
memset(bee,0,sizeof bee);
for(int i=1;i<=n;i++) c[i]=rand();
for(int i=1;i<=d;i++)
for(int k=1;k<=n;k++)
if(c[k])
bee[i]=(bee[i]+yuy[k][i]*yuy[k][j])%3;
for(int i=1;i<=n;i++)
for(int j=1;j<=d;j++)
for(int k=1;k<=d;k++)
dew[i]=(dew[i]+bee[(j-1)*d+k]*yuy[p[i]][j]*yuy[p[i]][k])%3;
for(int i=1;i<=n;i++)
if(dew[i]!=c[i])
{
for(int j=1;j<=n;j++)
{
int sum=0;
for(int k=1;k<=d;k++)
sum=(sum+yuy[i][k]*yuy[j][k])&1;
if(!sum)
{
if(i<j) printf("%d %d\n",i,j);
else printf("%d %d\n",j,i);
return;
}
}
}
}
puts("-1");
}
}
int main()
{
n=read(),d=read(),k=read();
if(k==2) beecute::work();
else beelovely::work();
return 0;
}

2019.2.11

LOJ 2664. 「NOI2013」向量内积 解题报告的更多相关文章

  1. 「SDOI2014」向量集 解题报告

    「SDOI2014」向量集 维护一个向量集合,在线支持以下操作: A x y :加入向量 \((x, y)\): Q x y l r:询问第 \(L\) 个到第 \(R\) 个加入的向量与向量 \(( ...

  2. loj#2665. 「NOI2013」树的计数

    目录 题目链接 题解 代码 题目链接 loj#2665. 「NOI2013」树的计数 题解 求树高的期望 对bfs序分层 考虑同时符合dfs和bfs序的树满足什么条件 第一个点要强制分层 对于bfs序 ...

  3. 「FJOI2016」神秘数 解题报告

    「FJOI2016」神秘数 这题不sb,我挺sb的... 我连不带区间的都不会哇 考虑给你一个整数集,如何求这个神秘数 这有点像一个01背包,复杂度和值域有关.但是你发现01背包可以求出更多的东西,就 ...

  4. 「ZJOI2016」大森林 解题报告

    「ZJOI2016」大森林 神仙题... 很显然线段树搞不了 考虑离线操作 我们只搞一颗树,从位置1一直往后移动,然后维护它的形态试试 显然操作0,1都可以拆成差分的形式,就是加入和删除 因为保证了操 ...

  5. 「SCOI2016」背单词 解题报告

    「SCOI2016」背单词 出题人sb 题意有毒 大概是告诉你,你给一堆n个单词安排顺序 如果当前位置为x 当前单词的后缀没在这堆单词出现过,代价x 这里的后缀是原意,但不算自己,举个例子比如abc的 ...

  6. 「NOI2015」寿司晚宴 解题报告

    「NOI2015」寿司晚宴 这个题思路其实挺自然的,但是我太傻了...最开始想着钦定一些,结果发现假了.. 首先一个比较套路的事情是状压前8个质数,后面的只会在一个数出现一次的再想办法就好. 然后发现 ...

  7. 「SCOI2015」国旗计划 解题报告

    「SCOI2015」国旗计划 蛮有趣的一个题 注意到区间互不交错,那么如果我们已经钦定了一个区间,它选择的下一个区间是唯一的,就是和它有交且右端点在最右边的,这个可以单调队列预处理一下 然后往后面跳拿 ...

  8. 「JLOI2015」骗我呢 解题报告?

    「JLOI2015」骗我呢 这什么神仙题 \[\color{purple}{Link}\] 可以学到的东西 对越过直线的东西翻折进行容斥 之类的..吧? Code: #include <cstd ...

  9. 「JLOI2015」城池攻占 解题报告

    「JLOI2015」城池攻占 注意到任意两个人的战斗力相对大小的不变的 可以离线的把所有人赛到初始点的堆里 然后做启发式合并就可以了 Code: #include <cstdio> #in ...

随机推荐

  1. EF 利用PagedList进行分页并结合查询 方法2

    微软提供了PagedList分页,相信大家在网上也能搜索一大堆关于pagedList用法的博客,论坛.但是,在使用的过程中一不小心,就会掉入pagedList某种常规用法的陷阱. 我所说的某种常规用法 ...

  2. Spring Aop: 关于继承和execution target this @annotation

    1.多态 target指通过这个对象调用的方法   (匹配标识对象的所有方法)  getMethod() this指调用这个对象的方法 (匹配标识对象实现的方法) getDeclaredMethod( ...

  3. Flutter - 本地化语言

    Flutter有很多本地化的packages使用,我现在用的是 flutter_i18n 项目主页:https://pub.dartlang.org/packages/flutter_i18n 1.安 ...

  4. 基于DDD的.NET开发框架ABP实例,多租户 (Saas)应用程序,采用.NET MVC, Angularjs, EntityFramework-介绍

    介绍 基于ABPZERO的多租户 (Saas)应用程序,采用ASP.NET MVC, Angularjs-介绍 ASP.NET Boilerplate作为应用程序框架. ASP.NET MVC和ASP ...

  5. C#_委托与事件

    委托: 把方法当作参数进行传递 public delegate void AddDelegate(string name); public class Ad{ //addDelegate就是委托的一个 ...

  6. mysql主从同步(2)-问题梳理

    之前详细介绍了Mysql主从复制的原理和部署过程,在mysql同步过程中会出现很多问题,导致数据同步异常.以下梳理了几种主从同步中可能存在的问题:1)slave运行过慢不能与master同步,也就是M ...

  7. db2安装

    官网下载: DB2 11.1 data server trial for Linux® on AMD64 and Intel® EM64T systems (x64)v11.1_linuxx64_se ...

  8. Linux大棚命令记录

    查看系统支持的shell: cat  /etc/shells 查看当前系统用的shell: echo $SHELL 从bash切换到zsh: 先yum安装,然后 chsh -s /bin/zsh ,退 ...

  9. linux内核分析第八次实验

    20135118 罗鹏越 本周学习的是linux内核中的进程调度,之前我们在操作系统中有讲解进程调度的分类,以及一些调度算法.而linux中的进程调度有所不同,首先老师讲解了进程调度和进程调度的时机, ...

  10. SpringMVC视图解析器概述

    不论控制器返回一个String,ModelAndView,View都会转换为ModelAndView对象,由视图解析器解析视图,然后,进行页面的跳转. 控制器处理方法---->ModelAndV ...