Description

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

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

第一行包含3个正整数n,d,k,分别表示向量的个数,维数以及待检测的倍数。
接下来n行每行有d个非负整数,其中第i行的第j个整数表示向量xi的第j维权值xi,j。
Output

包含两个整数,用空格隔开。
如果存在两个向量xp,xq的内积为k的整数倍,则输出两个向量的编号p与q(要求p<q)。如果存在多组这样的向量组合,输出其中任意一组即可。
若不存在这样的向量组合,则输出两个-1。
Sample Input
Sample Output
HINT

话说每次我都把题目复制一遍充字数2333

k=2时

我们把n个向量拼在一起,变成一个n*d的矩阵,设它为A,然后D=A*A’,A’为A的转置矩阵(行列互换),发现D[i,j]就表示向量i和向量j的内积

假设无解的话那么D矩阵除了对角线以外其他都是1,我们把无解的这个矩阵求出来设为C(只要求对角线),然后判断C和D是否相等,相等就无解

于是随机生成一个1*n的矩阵X判断X*A*A’是否等于X*C,假设不等于的话我们就找出不相等的那个位置,假设是第i个不相等,那就肯定存在一个j使得向量i与向量j的内积mod k=0

所以这个就暴力判断一下

k=3时

我们不能确定矩阵C的样子了,因为有三种情况0,1,2

但是我们发现1^2 mod 3=1,2^2 mod 3=1,所以我们让这个矩阵的元素都平方一下,那么矩阵C又变成了除了对角线其他都是1

但是前面又不好算了,其实也很好算,内积的平方拆开就变成了d^2维的向量的内积(空间存不下,直接照着式子算就行了)

其实随机生成矩阵不是很好,为0的话就没有用了,所以我直接用了全都是1的矩阵来跑答案

由于时间实在卡得太紧,我在Wikioi下了数据(可惜Wikioi没有spj)然后当提答题在bzoj上交了233

 const
maxn=;
maxd=;
var
a:array[..maxn,..maxd]of longint;
b,c,x,y:array[..maxn]of longint;
n,d,k:longint; procedure work2;
var
i,j,k,s:longint;
begin
s:=;
for i:= to n do s:=s xor x[i];
for i:= to n do c[i]:=s xor x[i] xor(x[i] and y[i]);
for i:= to n do
for j:= to d do
b[j]:=b[j] xor (x[i] and a[i,j]);
for i:= to d do x[i]:=b[i];
for i:= to d do b[i]:=;
for i:= to d do
for j:= to n do
b[j]:=b[j] xor (x[i] and a[j,i]);
for i:= to n do
if b[i]<>c[i] then
begin
for j:= to n do
if i<>j then
begin
s:=;
for k:= to d do
s:=s xor (a[i,k] and a[j,k]);
if s= then
begin
writeln(i,' ',j);
exit;
end;
end;
end;
writeln('-1 -1');
end; procedure work3;
var
i,j,k,s:longint;
begin
s:=;
for i:= to n do if y[i]> then y[i]:=;
for i:= to n do inc(s,x[i]);
for i:= to n do c[i]:=(s-x[i]+x[i]*y[i])mod ;
for i:= to n do
for j:= to d do
for k:= to d do
inc(b[(j-)*d+k],x[i]*a[i,j]*a[i,k]);
for i:= to d*d do
begin
x[i]:=b[i]mod ;
b[i]:=;
end;
for i:= to d do
for j:= to d do
for k:= to n do
inc(b[k],x[(i-)*d+j]*a[k,i]*a[k,j]);
for i:= to n do b[i]:=b[i]mod ;
for i:= to n do
if b[i]<>c[i] then
begin
for j:= to n do
if i<>j then
begin
s:=;
for k:= to d do
s:=s+a[i,k]*a[j,k];
if s mod = then
begin
writeln(i,' ',j);
exit;
end;
end;
end;
writeln('-1 -1')
end; procedure main;
var
i,j:longint;
begin
read(n,d,k);
for i:= to n do
for j:= to d do
begin
read(a[i,j]);
a[i,j]:=a[i,j]mod k;
end;
for i:= to n do x[i]:=random(k);
for i:= to n do
for j:= to d do
y[i]:=y[i]+a[i,j]*a[i,j];
for i:= to n do y[i]:=y[i]mod k;
if k= then work2
else work3;
end; begin
randomize;
main;
end.

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

  1. bzoj 3243: [Noi2013]向量内积

    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. TrineaAndroidCommon API Guide

    android-common-lib 关于我,欢迎关注微博:Trinea    主页:trinea.cn    邮箱:trinea.cn#gmail.com    微信:codek2 主要包括:缓存( ...

  2. yarn.resourcemanager.ha.id设置

    resourcemanager启动报错,其中一个启动成功,另一个启动报8088端口被成功启动的rm占用 2016-11-18 17:08:49,478 INFO org.apache.zookeepe ...

  3. Git之基本命令

    先介绍一下Git: Git是一个分布式的版本控制系统,最初由Linus Torvalds编写,用作Linux内核代码的管理.在推出后,Git在其它项目中也取得了很大成功,尤其是在Ruby社区中.目前, ...

  4. [转]oracle 实现插入自增列

    本文转自:http://blog.csdn.net/love_zt_love/article/details/7911104 刚使用oracle,它和sql server 好多地方还是有所不同的,简单 ...

  5. web.config connectionStrings 数据库连接字符串的解释

    先来看一下默认的连接SQL Server数据库配置<connectionStrings>   <add name="LocalSqlServer" connect ...

  6. [转] 正则表达式 oracle

    地址:http://www.cnblogs.com/Azhu/archive/2012/04/03/2431127.html 从oracle database 10gsql 开发指南中copy的. 正 ...

  7. socket.io问题,io.sockets.manager.rooms和io.sockets.clients('particular room')这两个函数怎么用?

    为什么我用nodejs用这个两个函数获取都会出错呢?是不是socket的api改了?请问现在获取房间数和当前房间的客户怎么获取?什么函数?谢谢!!急求!     网友采纳 版本问题.io.socket ...

  8. 微信公众号与HTML 5混合模式揭秘2——分享手机相册中照片

    本书是分享微信jssdk开发的第二篇.     4.2.1 项目需求 需求说明:实现微信端的手机用户,点击按钮选取1张图片,分享到朋友圈. 4.2.2 需求分解 通过对需求的了解,可以将其分解为: ( ...

  9. 防止双击选中html中文字

    在开发过程中很常用的会给<span></span>等内联元素增加一个onlick事件,但是经常发生的一件事情就是点击的时候,选中了span中的字体:倒是不影响主逻辑,但是很难受 ...

  10. python自定义日志函数测试

    #!/user/bin/python # -*- encoding: UTF-8 -*- import sys def logs(): print sys._getframe().f_code.co_ ...