3243: [Noi2013]向量内积

Time Limit: 10 Sec  Memory Limit: 256 MBSec  Special Judge
Submit: 1249  Solved: 248
[Submit][Status][Discuss]

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。
N<=100000,D<=30,K<=3,Xi,j<10

Output

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

Sample Input

2 20 2
0 0 1 1 1 1 1 0 1 1 1 0 1 0 0 0 1 1 1 1
1 0 1 0 1 0 1 1 1 1 0 1 1 1 0 1 1 0 1 0

Sample Output

1 2

HINT

新增数据一组,但未重测By TA1111,2016.5.17

Source

Solution

这道题非常劲。

首先在这道题因为只是输出一组即可,所以,可以想到乱搞。

最暴力的方法就是$O(N^2d)$的复杂度枚举,非常不科学。

考虑利用矩阵的性质,直接用$A*A^{T}$,这样的复杂度还是$O(N^{2}d)$的。

然后我们考虑随机乱搞。 直接随机两个相乘,误差太大,复杂度极不稳定。

然后我们考虑拿一个向量,去和其他所有向量相乘。这样单次的复杂度是$O(Nd)$的,可以稍多做几次。

在$K=2$的时候,我们关心的是矩阵中是否有0,然后我们取这样一个向量做的时候,如果有一个位置不一样,那么就说明有不同。

然后我们就可以直接暴力的找这个不同的位置了。

这样也是有概率出错的,所以我们需要多做几次。

至于这个向量的选取,我们考虑随机一个向量。 对于这个矩阵,我们也可以随机一个排列,这样能降低错误概率。

然后就是$K=3$的情况了。 这样就不是直接考虑$modK$后1,0的情况了,因为这样会出现0,1,2的情况,然后很神奇的,$1^{2}=1mod3=1,2^{2}=4mod3=1$

然后我们对他们平方,就变成了$d^{2}$维的向量了,就又转变为上述情况了,复杂度自然也变成了$O(d^{2})$。

TA爷说这是卡不掉的。

需要随机的那个向量,是必须随机,因为如果构造的话,是可以卡的,比如构造全1向量就可以被卡。

讲道理应该多random_shuffle几遍的,但是我就random_suffle了一遍就很exciting的AC了...然而跑的还是不快。

Code

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<ctime>
using namespace std;
inline int read()
{
int x=,f=; char ch=getchar();
while (ch<'' || ch>'') {if (ch=='-') f=-; ch=getchar();}
while (ch>='' && ch<='') {x=x*+ch-''; ch=getchar();}
return x*f;
}
#define MAXN 100010
int N,d,K,A[MAXN][],B[],C[][];
int Judge(int x,int y)
{
int re=;
for (int i=; i<=d; i++) re+=A[x][i]*A[y][i];
return re%K;
}
int OK(int x)
{
int re=;
if (K==)
for (int i=; i<=d; i++) re^=B[i]&A[x][i],B[i]^=A[x][i];
else
for (int i=; i<=d; i++)
for (int j=; j<=d; j++)
re+=C[i][j]*A[x][i]*A[x][j],(C[i][j]+=A[x][i]*A[x][j])%=K;
return re%K;
}
int id[MAXN];
void Solve()
{
for (int i=; i<=N; i++) id[i]=i;
random_shuffle(id+,id+N+);
memset(B,,sizeof(B)); memset(C,,sizeof(C));
for (int i=; i<=N; i++)
if (OK(id[i])!=(i-)%K)
for (int x,y,j=; j<=i-; j++)
if (!Judge(id[i],id[j]))
x=min(id[i],id[j]),y=max(id[i],id[j]),printf("%d %d\n",x,y),exit();
}
int main()
{
N=read(); d=read(); K=read();
for (int i=; i<=N; i++)
for (int j=; j<=d; j++)
A[i][j]=read()%K;
for (int i=; i<=; i++) Solve();
puts("-1 -1");
return ;
}

【BZOJ-3243】向量内积 随机化 + 矩阵的更多相关文章

  1. [BZOJ]3243 向量内积(Noi2013)

    小C做了之后很有感觉的题目之一,但因为姿势不对调了很久. Description 两个d 维向量A=[a1,a2,...,ad]与B=[b1,b2,...,bd]的内积为其相对应维度的权值的乘积和,即 ...

  2. BZOJ 3243 向量内积

    Description 两个\(d\)维向量\(A=[a_{1},a_{2},...,a_{d}]\)与\(B=[b_{1},b_{2},...,b_{d}]\)的内积为其相对应维度的权值的乘积和,即 ...

  3. 【BZOJ3243】【NOI2013】向量内积(矩阵,数论)

    [BZOJ3243][NOI2013]向量内积(矩阵,数论) 题面 BZOJ 题解 这题好神仙. 首先\(60\)分直接是送的.加点随机之类的可以多得点分. 考虑正解. 我们先考虑一下暴力. 我们把\ ...

  4. UOJ#121. 【NOI2013】向量内积 随机化算法,矩阵

    原文链接www.cnblogs.com/zhouzhendong/UOJ121.html 前言 完蛋了我越来越菜了贺题都不会了. 题解 $O(n ^ 2 d) $ 暴力送 60 分. Bitset 优 ...

  5. [Noi2013]向量内积

    来自FallDream的博客,未经允许,请勿转载,谢谢. 两个d 维向量A=[a1,a2,...,ad]与B=[b1,b2,...,bd]的内积为其相对应维度的权值的乘积和,即: $\sum_{i=1 ...

  6. LOJ 2664. 「NOI2013」向量内积 解题报告

    #2664. 「NOI2013」向量内积 两个 \(d\) 维向量 \(A=[a_1, a_2 ,...,a_d]\) 与 \(B=[b_1 ,b_2 ,...,b_d]\) 的内积为其相对应维度的权 ...

  7. BZOJ3243/UOJ121 [Noi2013]向量内积

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  8. P1224 [NOI2013]向量内积

    传送门 发现这个内积和矩乘有点像,考虑构造一个 $n$ 行 $m$ 列的矩阵 $A$,每一行都是一个题目给定的 $m$ 维向量 设 $B=AA^T$ ,其中 $A^T$ 为 $A$ 的转置矩阵,那么对 ...

  9. 【fake题解】[NOI2013]向量内积

    [fake题解][NOI2013]向量内积 做法1 大暴力.哪里不会T哪里. 做法2 所有数都%=k不影响结果.(废话 k的取值只有2和3,所以肯定是要分类讨论的.k=2肯定简单些啦. k=2 出现的 ...

随机推荐

  1. [css]我要用css画幅画(八) - Hello Kitty

    接着之前的[css]我要用css画幅画(七) - 哆啦A梦,这次画的是Hello Kitty. /* 开始前先说点废话, 一转眼就2016年了,过完年后一直没更新博客,无他,就是懒得动. 这一转眼,一 ...

  2. Sql--order by、desc降序、top

    ---------通过order by 语句进行排序: --1.降序order by 列名desc --2.升序order by 列名   或order by 列名asc --3.order by语句 ...

  3. .NET轻量级RPC框架:Rabbit.Rpc

    最近准备写一个.NET的管理平台应用在公司,由于存在大量的Client => Server,Server => Client的请求需求在加上之前一直接触了解过RpcClient组件的开发, ...

  4. 非root用户的SSH免密登录

    在网上找到的教程一般是这样说的 cd ~/.ssh/ # 若没有该目录,请先执行一次ssh localhost ssh-keygen -t rsa # 会有提示,都按回车就可以 cat id_rsa. ...

  5. Shelve Instance 操作详解 - 每天5分钟玩转 OpenStack(38)

    Instance 被 Suspend 后虽然处于 Shut Down 状态,但 Hypervisor 依然在宿主机上为其预留了资源,以便在以后能够成功 Resume. 如果希望释放这些预留资源,可以使 ...

  6. Apache 安装配置详情

    本次文章讲解Apache的安装和基本的配置 输入PHP环境搭建的一部分 PHP完整配置信息请参考 http://www.cnblogs.com/azhe-style/p/php_new_env_bui ...

  7. ipv4理论知识1-ipv4介绍,ipv4记法,地址段个数算法

    定义 在TCP/IP协议中,用于在IP层识别连接到因特网设备的标识符称为因特网地址或IP地址.IPv4地址是一个32位的地址. 地址空间 像IPv4这种定义了地址的协议都有一个地址空间.地址空间就是协 ...

  8. Ubuntu安装Maven3

    先增加Maven3的源,在/etc/apt/sources.list中添加以下信息 deb http://ppa.launchpad.net/natecarlson/maven3/ubuntu pre ...

  9. Qt 之 入门例程 (一)

    以 “Hello Qt” 为例,介绍如何建立一个 Qt 工程 . 1  QLabel 例程 QLabel 继承自 QFrame (继承自 QWidget),主要用来显示文本和图片. 1.1  Hell ...

  10. Java反射特性--获取其他类实例并调用其方法

    1. 代码结构 .├── com│   └── test│   └── MyTest.java└── MainCall.java 2. 代码内容 MyTest.java: package com.te ...