#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. Asp.Net MVC页面显示后台处理进度问题

    这个问题的背景是,用户通过浏览器上传文件或Excel数据到系统中,页面需要时时显示后台处理进度,以增强用户的体验. 在GitHub上找到一个一个项目,基本实现了这个功能,具体效果如下图 代码实现过程大 ...

  2. Ubuntu 打包后安装提示:子进程 已安装 pre-removal 脚本 返回了错误号 1

    子进程 已安装 pre-removal 脚本 返回了错误号 1或2 与 子进程 已安装 post-installation 脚本 返回了错误号 1或2   一.子进程 已安装 pre-removal  ...

  3. .net mvc数据库操作添加数据的几中方法

    1. Defining sets on a derived context 1) DbSet属性:指定集合为Entity类型 2) IDbSet属性 3) 只读set属性 public IDbSet& ...

  4. webpack教程(五)——图片的加载

    首先安装的依赖 npm install file-loader --save-devnpm install image-webpack-loader --save-devnpm install url ...

  5. JAVA CAS原理浅谈

    java.util.concurrent包完全建立在CAS之上的,没有CAS就不会有此包.可见CAS的重要性. CAS CAS:Compare and Swap, 翻译成比较并交换. java.uti ...

  6. TRIO-basic指令--九九乘法表demo

    在路上闲的没事,想到之前自己用别的语言实现乘法口诀表,于是来了兴趣用TRIO-basic试一下,挺简单的一段代码,大家看看就好. ' TRIO-basic '实现乘法口诀表 定义两个整型的局部变量 D ...

  7. open-falcon ---客户机agent操作

    open-falcon的agent用于采集机器负载监控指标,比如cpu.idle.load.1min.disk.io.util等等,每隔60秒push给Transfer.agent与Transfer建 ...

  8. 太白教你学python---博客分类目录

    太白非技术类随笔(持续更新中...猛击这里!!!) python基础 python基础一 pytcharm安装详细教程 python基础二 python基础数据类型 Python最详细,最深入的代码块 ...

  9. hdu 3038 给区间和,算出多少是错的

    参考博客 How Many Answers Are Wrong Problem Description TT and FF are ... friends. Uh... very very good ...

  10. jsp中获取不到servlet的cookie

    今天做登陆,发现jsp中使用document.cookie获取不到servlet生成的cookie,我们可以在浏览器的cookie文件夹中发现,servlet中生成的cookie和jsp中的生成的路径 ...