LOJ 2664. 「NOI2013」向量内积 解题报告
#2664. 「NOI2013」向量内积
两个 \(d\) 维向量 \(A=[a_1, a_2 ,...,a_d]\) 与 \(B=[b_1 ,b_2 ,...,b_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\),然后判断是否有
\]
并且我们可以判断出哪一行不相等,然后可以暴力枚举与之匹配的另一个。
或者随机一下原始向量的排列顺序。
至于为什么随机次数是常数次,可以从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」向量内积 解题报告的更多相关文章
- 「SDOI2014」向量集 解题报告
「SDOI2014」向量集 维护一个向量集合,在线支持以下操作: A x y :加入向量 \((x, y)\): Q x y l r:询问第 \(L\) 个到第 \(R\) 个加入的向量与向量 \(( ...
- loj#2665. 「NOI2013」树的计数
目录 题目链接 题解 代码 题目链接 loj#2665. 「NOI2013」树的计数 题解 求树高的期望 对bfs序分层 考虑同时符合dfs和bfs序的树满足什么条件 第一个点要强制分层 对于bfs序 ...
- 「FJOI2016」神秘数 解题报告
「FJOI2016」神秘数 这题不sb,我挺sb的... 我连不带区间的都不会哇 考虑给你一个整数集,如何求这个神秘数 这有点像一个01背包,复杂度和值域有关.但是你发现01背包可以求出更多的东西,就 ...
- 「ZJOI2016」大森林 解题报告
「ZJOI2016」大森林 神仙题... 很显然线段树搞不了 考虑离线操作 我们只搞一颗树,从位置1一直往后移动,然后维护它的形态试试 显然操作0,1都可以拆成差分的形式,就是加入和删除 因为保证了操 ...
- 「SCOI2016」背单词 解题报告
「SCOI2016」背单词 出题人sb 题意有毒 大概是告诉你,你给一堆n个单词安排顺序 如果当前位置为x 当前单词的后缀没在这堆单词出现过,代价x 这里的后缀是原意,但不算自己,举个例子比如abc的 ...
- 「NOI2015」寿司晚宴 解题报告
「NOI2015」寿司晚宴 这个题思路其实挺自然的,但是我太傻了...最开始想着钦定一些,结果发现假了.. 首先一个比较套路的事情是状压前8个质数,后面的只会在一个数出现一次的再想办法就好. 然后发现 ...
- 「SCOI2015」国旗计划 解题报告
「SCOI2015」国旗计划 蛮有趣的一个题 注意到区间互不交错,那么如果我们已经钦定了一个区间,它选择的下一个区间是唯一的,就是和它有交且右端点在最右边的,这个可以单调队列预处理一下 然后往后面跳拿 ...
- 「JLOI2015」骗我呢 解题报告?
「JLOI2015」骗我呢 这什么神仙题 \[\color{purple}{Link}\] 可以学到的东西 对越过直线的东西翻折进行容斥 之类的..吧? Code: #include <cstd ...
- 「JLOI2015」城池攻占 解题报告
「JLOI2015」城池攻占 注意到任意两个人的战斗力相对大小的不变的 可以离线的把所有人赛到初始点的堆里 然后做启发式合并就可以了 Code: #include <cstdio> #in ...
随机推荐
- mybatis 缓存的使用, 看这篇就够了
目录 1 一级缓存 1.1 同一个 SqlSession 1.2 不同的 SqlSession 1.3 刷新缓存 1.4 总结 2 二级缓存 2.1 配置二级缓存 2.2 使用二级缓存 2.3 配置详 ...
- 【转】Git版本控制软件从入门到精通学习手册
GIT 学习手册简介 本站为 Git 学习参考手册.目的是为学习与记忆 Git 使用中最重要.最普遍的命令提供快速翻阅. 这些命令以你可能需要的操作类型划分,并且将提供日常使用中需要的一些常用的命令以 ...
- @Pointcut的用法
在Spring 2.0中,Pointcut的定义包括两个部分:Pointcut表示式(expression)和Pointcut签名(signature).让我们先看看execution表示式的格式: ...
- kvm虚拟化管理平台WebVirtMgr部署-完整记录(0)
打算部署kvm虚拟机环境,下面是虚拟化部署前的一些准备工作: 操作系统环境安装1)修改内核模式为兼容内核启动[root@ops ~]# uname -aLinux openstack 2.6.32-4 ...
- 如何新增一个ssh-key文件
前言 由于在公司有一个sshkey 在用,用于绑定公司的git code 仓库.那么在家要连上git hub 仓库,就也需要一个 ssh key .为了避免公司信息外露,所以还是新增一个ssh key ...
- vs感受,由于我的电脑装了俩年了!我直接写感受吧
个人感受:最初的感觉,最开始装vs是因为我的电脑8.1不兼容vc6.0(一个挺坑的编程软件),最开始用vs的时候我还是一个小白什么都不懂,vs创建项目实在是太复杂,不看教程根本看不懂,也许是它能包容的 ...
- M2 终审
1.团队成员简介 左边:马腾跃 右边:陈谋 左上:李剑锋 左下:仉伯龙 右:卢惠明 团队成员及博客: 李剑锋: Blog: http://www.cnblogs.com/Po ...
- 20135337——Linux实践二:模块
一.编译&生成&测试&删除 1.编写模块代码,查看如下 gedit 1.c(编写) cat 1.c(查看) MODULE_AUTHOR("Z") MODUL ...
- Beta版发布说明
我们的作品“校友聊”软件的最终版本于6月19日最终发布了,下面我们将对自己的产品进行介绍. 在使用之前,首先要进行用户注册,用户可以自行设置自己的账号,姓名,密码,签名,头像等信息,头像信息也可以在文 ...
- 20150401 作业2 结对 四则运算ver 1.0
Web項目下 Tomcat服務器的路徑 /WebContant/ 目錄下 SE2_2.jsp <%@ page language="java" contentType=&qu ...