#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:

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <cctype>
  4. #include <cstdlib>
  5. #include <algorithm>
  6. int read()
  7. {
  8. int x=0;char c=getchar();
  9. while(!isdigit(c)) c=getchar();
  10. while(isdigit(c)) x=x*10+c-'0',c=getchar();
  11. return x;
  12. }
  13. int n,d,k;
  14. namespace beecute
  15. {
  16. int yuy[20010][110],bee[110],dew[20010],c[20010];
  17. void work()
  18. {
  19. for(int i=1;i<=n;i++)
  20. for(int j=1;j<=d;j++)
  21. yuy[i][j]=read()&1;
  22. int Dew=5;
  23. while(Dew--)
  24. {
  25. memset(dew,0,sizeof dew);
  26. memset(bee,0,sizeof bee);
  27. for(int i=1;i<=n;i++) c[i]=rand()&1;
  28. for(int i=1;i<=d;i++)
  29. for(int j=1;j<=n;j++)
  30. if(c[j])
  31. bee[i]=bee[i]+yuy[j][i]&1;
  32. for(int i=1;i<=n;i++)
  33. for(int j=1;j<=d;j++)
  34. dew[i]=(dew[i]+bee[j]*yuy[i][j])&1;
  35. for(int i=1;i<=n;i++)
  36. if(dew[i]!=c[i])
  37. {
  38. for(int j=1;j<=n;j++)
  39. {
  40. int sum=0;
  41. for(int k=1;k<=d;k++)
  42. sum=(sum+yuy[i][k]*yuy[j][k])&1;
  43. if(!sum)
  44. {
  45. if(i<j) printf("%d %d\n",i,j);
  46. else printf("%d %d\n",j,i);
  47. return;
  48. }
  49. }
  50. }
  51. }
  52. puts("-1");
  53. }
  54. }
  55. namespace beelovely
  56. {
  57. int yuy[100010][101],bee[10010],dew[100010],c[100010];
  58. void work()
  59. {
  60. for(int i=1;i<=n;i++)
  61. for(int j=1;j<=d;j++)
  62. yuy[i][j]=read()%3;
  63. for(int i=1;i<=d;i++)
  64. for(int j=1;j<=d;j++)
  65. for(int k=1;k<=n;k++)
  66. (bee[(i-1)*d+j]+=yuy[k][i]*yuy[k][j])%=3;
  67. int Dew=5;
  68. while(Dew--)
  69. {
  70. memset(dew,0,sizeof dew);
  71. memset(bee,0,sizeof bee);
  72. for(int i=1;i<=n;i++) c[i]=rand();
  73. for(int i=1;i<=d;i++)
  74. for(int k=1;k<=n;k++)
  75. if(c[k])
  76. bee[i]=(bee[i]+yuy[k][i]*yuy[k][j])%3;
  77. for(int i=1;i<=n;i++)
  78. for(int j=1;j<=d;j++)
  79. for(int k=1;k<=d;k++)
  80. dew[i]=(dew[i]+bee[(j-1)*d+k]*yuy[p[i]][j]*yuy[p[i]][k])%3;
  81. for(int i=1;i<=n;i++)
  82. if(dew[i]!=c[i])
  83. {
  84. for(int j=1;j<=n;j++)
  85. {
  86. int sum=0;
  87. for(int k=1;k<=d;k++)
  88. sum=(sum+yuy[i][k]*yuy[j][k])&1;
  89. if(!sum)
  90. {
  91. if(i<j) printf("%d %d\n",i,j);
  92. else printf("%d %d\n",j,i);
  93. return;
  94. }
  95. }
  96. }
  97. }
  98. puts("-1");
  99. }
  100. }
  101. int main()
  102. {
  103. n=read(),d=read(),k=read();
  104. if(k==2) beecute::work();
  105. else beelovely::work();
  106. return 0;
  107. }

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. 浅谈MySQL引擎(纯个人理解,如有错误请指正)

    MySQL有很多引擎,MyISAM.InnoDB.MERGE.MEMORY(HEAP).BDB(BerkeleyDB).EXAMPLE.FEDERATED...等等 比较常用的就是InnoDB和MyI ...

  2. windows下pwd、ls、tail-f命令使用

    一.问题 习惯了linux命令,在windows上使用cmd没有这些命令时很不习惯. 二.解决办法 2.1 找到这些命令对应的windows命令 ls,对应于windows的dir pwd,对应于wi ...

  3. item 2: 理解auto类型的推导

    本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 如果你已经读过item 1的模板类型推导,你已经知道大部分关于au ...

  4. [UWP 自定义控件]了解模板化控件(7):支持Command

    以我的经验来说,要让TemplatedControl支持Command的需求不会很多,大部分情况用附加属性解决这个需求会更便利些,譬如UWPCommunityToolkit的HyperlinkExte ...

  5. VMware workstation运维实践系列博客导航

    第一章:VMware workstation虚拟化1.1 VMware workstation计算网络存储介绍1.2 VMware workstation其他功能特性介绍1.3 VMware work ...

  6. Centos下堡垒机Jumpserver V3.0环境部署完整记录(1)-安装篇

    由于来源身份不明.越权操作.密码泄露.数据被窃.违规操作等因素都可能会使运营的业务系统面临严重威胁,一旦发生事故,如果不能快速定位事故原因,运维人员往往就会背黑锅.几种常见的运维人员背黑锅场景:1)由 ...

  7. Java实验二

    北京电子科技学院(BESTI) 实     验    报     告 课程:Java程序设计 班级:1351    姓名:黄君如  学号:20135117 成绩:             指导教师:娄 ...

  8. [转] Linux有问必答:如何修复“sshd error: could not load host key”

    编译自:http://ask.xmodulo.com/sshd-error-could-not-load-host-key.html作者: GOLinux 本文地址:https://linux.cn/ ...

  9. sqlalchemy 使用pymysql连接mysql 1366错误

    一.错误情况 mysql 5.7.2 \python35\lib\site-packages\pymysql\cursors.py:166: Warning: (1366, "Incorre ...

  10. Selenium Grid的Java调用方法

    java -jar selenium-server-standalone-.jar -role hub explorer http://192.168.1.173:4444/grid/console ...